请使用“首次离线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)
图片说明:
目前我做(根据上图):
- 来自Repository的
mLiveData
getLiveData - 回调
refreshFromDataBase()
- DataBase的
mLiveData.addSource
的LiveData
– 导致Android View快速更新的原因 - 回调
refreshFromNetwork()
- rest更新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时它们自己处理),如何将它们连续地链接在一起以限制一个流规则?
这取决于你的提取数据是否相似。 如果你新鲜的数据通常是完全不同的,我会删除所有的元素,然后插入新的元素只有一个方法,如下所示:
@Insert public void insertItems(Item... items);
如果你的新数据是相似的,你不关心他们的顺序,我会比较所有新的项目与旧的知道每个项目,如果你必须更新,插入或删除项目。 最后调用deleteItems(itemsToDelete),updateItems(itemsToUpdate)和insertItems(itemsToInsert)。 这三个方法与上面所写的类似,但使用了@Delete,@Update和@Insert。
如果您关心订单,我建议您查看Android Paging Library并创建一个自定义数据源,在此处您可以告诉实时数据何时更新其值。 一些链接开始: 这个 , 这个 , 这个和这个