моя архитектура приложения, довольно распространенная:
Пожалуйста, объясните мне, если у меня есть список сущностей, например
@Entity(tableName = TABLE_NAME)
class Item constructor(
@PrimaryKey(autoGenerate = false)
var id: Long = 0L,
@TypeConverters(ListToStringConverter::class)
var eventDescription: List<String> = emptyList(),
@TypeConverters(DateConverter::class)
var date: Date = Date(),
var rate: Int ?= null)
Пояснение к изображению:
В настоящее время я делаю (согласно картинке выше):
mLiveData
получить LiveData из репозитория- обратный вызов
refreshFromDataBase()
mLiveData.addSource
изLiveData
базы данных - почему Android View быстро обновляется- обратный вызов
refreshFromNetwork()
- Остальные обновления DatabaseTable
- Вставка базы данных приводит к тому, что добавление LiveData отправляет изменения в представление
Формулировка проблемы
Какова наилучшая практика для 5-го шага — момента, когда приходят новые данные, и мне приходится заменять старые данные самыми свежими?
В настоящее время я использую RxJava, Room, Kotlin, и на шаге 3 я использую вложенный Rx.Single, который является очень уродливым спагетти-кодом.
нравится
disposable = usecase.getDataFromNetwork()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onSuccess = {
val itemsList = it
dataBase.deleteAllItems()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy (onComplete = { dataBase.insertNewItems(itemsList)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onComplete = {
// Process complete
}, onError = {
...
})
}
}, onError = {
...
})
}, onError = {
...
})
Уродливый спагетти-код.
ВОПРОСЫ
- Должен ли я стереть всю таблицу перед вставкой новых элементов? Livedata прослушивает изменения списка, поэтому всякий раз, когда что-либо изменяется (какой-то элемент обновляется, какой-то вставляется, какой-то удаляется), вид будет обновляться.
- При обстоятельствах, когда все мои потоки являются одиночными (причина: они удаляются сами по себе, когда onComplete), как связать их последовательно, чтобы ограничить одно правило потока?