Пожалуйста, объясните архитектуру 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)

Объяснение изображения:

В настоящее время я делаю (согласно рисунку выше):

  1. mLiveData getLiveData из репозитория
  2. ПерезвонитеrefreshFromDataBase()
  3. mLiveData.addSource от LiveData базы данных - что вызывает быстрое обновление Android View
  4. Перезвоните refreshFromNetwork()
  5. Остальные обновления DatabaseTable
  6. Вставка базы данных приводит к тому, что добавление 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 и создать собственный источник данных, где вы сможете сообщить действующим данным, когда нужно обновлять их значения. Некоторые ссылки для начала: это, это, это и это