【问题标题】:Jetpack compose with RxJava2 and RealmJetpack 与 RxJava2 和 Realm 组合
【发布时间】: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


    【解决方案1】:

    我最终解决了这个问题并采取了一种混合方法,我使用 Realm/RXJava 来处理数据流,当事情发生变化时,更新 LiveData 对象。

    查看模型

    private val internalItemList = MutableLiveData(listOf<Item>())
    val itemList: LiveData<List<Item>> = internalItemList
    
    //capture the subscription so you can dispose in onCleared()
    val subscription = items.observeOn(AndroidSchedulers.mainThread()).subscribe {
        this.internalItemList.value = it
    }
    

    查看

    val list by viewModel.itemList.observeAsState(listOf())
    

    这必须不那么健谈,并且可以按我的意愿工作。不确定这是否是正确的方法,但它似乎正在工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2018-07-22
      相关资源
      最近更新 更多