Пожалуйста, объясните архитектуру 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 получить LiveData из репозитория
  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 прослушивает изменения списка, поэтому всякий раз, когда что-либо изменяется (какой-то элемент обновляется, какой-то вставляется, какой-то удаляется), вид будет обновляться.
  • При обстоятельствах, когда все мои потоки являются одиночными (причина: они удаляются сами по себе, когда onComplete), как связать их последовательно, чтобы ограничить одно правило потока?

comment
Если вы не понимаете своей архитектуры, как мы должны понимать, учитывая ограниченное представление кода, который у нас есть?   -  person Gabe Sechan    schedule 16.11.2017
comment
Просто чтобы уточнить - я понимаю общий подход, но мне интересно, знает ли кто-нибудь лучшее решение для выполнения шага 5.   -  person murt    schedule 16.11.2017


Ответы (1)


Это зависит от того, будут ли ваши извлеченные данные похожими или нет. Если ваши свежие данные обычно полностью отличаются, я бы удалил все элементы, а затем вставил новые элементы только одним методом, например следующим:

@Insert
public void insertItems(Item... items);

Если ваши новые данные похожи и вас не волнует их порядок, я бы сравнил все новые элементы со старыми, чтобы знать для каждого элемента, если вам нужно обновить, вставить или удалить элемент. В конце вы вызываете deleteItems(itemsToDelete), updateItems(itemsToUpdate) и insertItems(itemsToInsert). Эти три метода аналогичны описанному выше, но с @Delete, @Update и @Insert.

Если вам небезразличен порядок, я рекомендую вам взглянуть на Android Paging Library и создайте пользовательский источник данных, в котором вы можете указать своим оперативным данным, когда обновлять его значения. Некоторые ссылки для начала: 5abf797585bd" rel="nofollow noreferrer">это, это, это и это

person Damia Fuentes    schedule 21.11.2017