我正在尝试在基于Kotlin的应用程序中使用Realm。
我建立了一个基础项目,测试了将元素添加到领域中并通过实时数据和视图模型对其进行观察。
然后,我想添加其他一些可观察的对象,并使用RxJava的CombineLatest来将它们组合。
我为所有可观察物创建了Rx可观察物。我观察来自Realm的实时数据,然后调用RxJava BehaviourSubject的onNext()方法将Rx Observable之一设置为与观察到的领域数据相同的值。这可以正常工作,但是一旦我在“油门”中添加了Rx运算符,就会收到以下错误消息:
来自错误线程的领域访问。只能在创建对象的线程上访问领域对象。在io.realm.BaseRealm.checkIfValid(BaseRealm.java:442)在io.realm.com_example_myapplication_ItemRealmProxy.realmGet $ id(com_example_myapplication_ItemRealmProxy.java:105)在io.realm.com_example_myapplication_ItemRealmProxy.toString(com_example_myapplication_ItemRealmProxy.java:661)
这是我的代码的一部分:
private val itemViewModel: ItemViewModel by lazy {
ViewModelProviders.of(this).get(ItemViewModel::class.java)
}
val itemsSubject = BehaviorSubject.createDefault(listOf<Item>())
val intsSubject = BehaviorSubject.createDefault(4)
itemViewModel.getItemData().observe(this, Observer<RealmResults<Item>> { t ->
val items = t.map {
it
}
itemsSubject.onNext(items)
})
Observables.combineLatest(itemsSubject, intsSubject) { a, b ->
a
}.throttleLast(500, TimeUnit.MILLISECONDS).subscribe {
Log.i("Items", "Items combined read: ${it}")
}
我看不到领域如何与onNext调用耦合,也看不到节流阀。看起来很奇怪。
理想情况下,我只想保留实时数据,但是我需要对其他可观察对象进行操作,而RxJava对此非常有用。
我需要在主线程上观察RxJava,如下所示:
Observables.combineLatest(itemsSubject, intsSubject) { a, b ->
a
}.throttleLast(500, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe {
Log.i("Items", "Items combined read: ${it}")
}
}
从某种意义上说,Realm错误具有误导性,因为它最终是对RxJava的不正确使用。