Пожалуйста, объясните архитектуру Android при использовании "Первый автономный подход".
Архитектура моего приложения, довольно распространенная:
Пожалуйста, объясните мне, если у меня есть список сущностей, например
@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
getLiveData из репозитория- Перезвоните
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 прослушивает изменения List, поэтому всякий раз, когда что-либо изменяется (некоторые элементы обновлены, некоторые добавлены, некоторые удалены), представление будет обновлено.
- В Обстоятельствах, где все мои Потоки являются Одиночными (причина: они располагаются самостоятельно при onComplete), как последовательно соединить их в oder, чтобы ограничить одно правило потока?
1 ответ
Это зависит от того, будут ли ваши извлеченные данные похожими или нет. Если у вас свежие данные, как правило, совершенно разные, я бы удалил все элементы, а затем вставил новые элементы только одним методом, например следующим
@Insert
public void insertItems(Item... items);
Если ваши новые данные похожи, и вы не заботитесь об их порядке, я бы сравнил все новые элементы со старыми, чтобы узнать для каждого элемента, нужно ли обновить, вставить или удалить элемент. В конце вы вызываете deleteItems(itemsToDelete), updateItems(itemsToUpdate) и insertItems(itemsToInsert). Эти три метода похожи на те, что написаны выше, но с @Delete, @Update и @Insert.
Если вы заботитесь о порядке, я рекомендую вам взглянуть на библиотеку подкачки Android и создать собственный источник данных, где вы сможете сообщить действующим данным, когда нужно обновлять их значения. Некоторые ссылки для начала: это, это, это и это