【发布时间】:2020-12-12 19:51:20
【问题描述】:
我正在通过一个新的 android 应用程序使用 Jetpack Compose (1.0.0-alpha08) 和 RxJava2 来管理来自我的模型(在本例中为 Realm 10)的数据流。对于给定的屏幕,我有一个视图模型它定义了将由顶级 Compostable 视图订阅的数据。因此,例如:
视图模型...
class ListItemViewModel: ViewModel() {
val items: Flowable<Item>
get() {
val data1 = userRealm.where<Item1>()
.also(query).findAllAsync().asFlowable()
.onBackpressureLatest().doOnNext{System.out.println("Realm on Next")}
.observeOn(
Schedulers.single()
).filter{it.isLoaded}.map{ result ->
System.out.println("Maping Realm")
result
}.doOnSubscribe {System.out.println("Subscribe")}
val data2 == //same as above but with a different item
return Flowable.combineLatest(data1, data2, combineFunction)
.onBackpressureLatest()
.doOnNext{System.out.println("Hello")}
.doOnComplete {System.out.println("Complete")}
.subscribeOn(AndroidSchedulers.mainThread())
}
}
查看
@Compostable
fun List(List<Item> items) {
val viewModel: ListItemViewModel = viewModel()
val list by viewModel.items.subscribeAsState(initial = listOf())
ItemList(list = list)
}
@Compostable
fun ItemList(List<Item> items {
LazyColumnFor(...) {
.......
}
}
一切都按我的预期工作,并且列表按我的意愿呈现在屏幕上。但是,我假设这里会发生订阅只会发生一次,而 Flowable 只会在发出新数据时推出新数据。因此,我只希望在流中存在新数据时触发各种 onNext 方法,例如领域数据库发生了一些变化。由于我没有在 Realm 中添加/删除任何数据,因此一旦获得第一组结果,我希望 flowable 会“静默”。
但是,当我运行上述程序时,与领域订阅相关的订阅消息被一遍又一遍地记录下来。 "Hello" 和 onNext 方法中的其他日志记录语句也是如此。此外,如果我在组合函数中添加任何日志记录,我会以与看到“Hello”日志相同的方式看到这些日志语句。由此看来,每次呈现可组合列表时,它都会从我的视图模型重新订阅 Flowable 并触发整个过程。正如我所说,我预计此订阅只会发生一次。
这也许是正确的行为,但在精神上,感觉就像我在无缘无故地消耗 CPU 周期,因为当没有数据更改时,我的方法被一遍又一遍地调用。我的设置是否正确,还是我的配置方式有问题?
【问题讨论】:
标签: android realm rx-java2 android-jetpack-compose