请使用“首次离线aproach”解释android架构。

我的应用程序架构,很常见:

在这里输入图像说明

例如,如果我有实体列表,请解释我

@Entity(tableName = TABLE_NAME) class Item constructor( @PrimaryKey(autoGenerate = false) var id: Long = 0L, @TypeConverters(ListToStringConverter::class) var eventDescription: List = emptyList(), @TypeConverters(DateConverter::class) var date: Date = Date(), var rate: Int ?= null) 

图片说明:

目前我做(根据上图):

  1. 来自Repository的mLiveData getLiveData
  2. 回调refreshFromDataBase()
  3. DataBase的mLiveData.addSourceLiveData – 导致Android View快速更新的原因
  4. 回调refreshFromNetwork()
  5. rest更新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时它们自己处理),如何将它们连续地链接在一起以限制一个流规则?

这取决于你的提取数据是否相似。 如果你新鲜的数据通常是完全不同的,我会删除所有的元素,然后插入新的元素只有一个方法,如下所示:

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

如果你的新数据是相似的,你不关心他们的顺序,我会比较所有新的项目与旧的知道每个项目,如果你必须更新,插入或删除项目。 最后调用deleteItems(itemsToDelete),updateItems(itemsToUpdate)和insertItems(itemsToInsert)。 这三个方法与上面所写的类似,但使用了@Delete,@Update和@Insert。

如果您关心订单,我建议您查看Android Paging Library并创建一个自定义数据源,在此处您可以告诉实时数据何时更新其值。 一些链接开始: 这个 , 这个 , 这个和这个