目前,在将值复制到域时,我会执行以下操作:
Observable<Home>
然后我可以访问侦听器内新添加的对象。什么是正确的RxJava完成相同的方式?观察者必须返回
return Observable.just(homeItem)
.map { (HomeItem homeItem) ->
return AnotherHomeItem(homeItem.xxx, homeItem.yyy)
}
.flatMap { (AnotherHomeItem anotherItem) ->
realm.beginTransaction()
val newItem = realm.copyToRealm(anotherItem).asObservable< AnotherHomeItem >()
realm.commitTransaction()
return newItem
}
.filter {
return it.isLoaded
}
,这是realmCopy而不是原始对象。可以任意1请提供样品吗?
通过这样做来管理让它工作,但我不确定这是最好的方法......推荐的方法是什么?
{{1}}
答案 0 :(得分:2)
您应该在后台线程上写入Realm,并在UI线程上使用不同的订阅进行观察。
您在后台线程上保留一个订阅:
public Subscription downloadObjectsFromNetwork() {
return objectApi.getObjects()
.subscribeOn(Schedulers.io())
.subscribe(response -> {
try(Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction(realm -> realm.insertOrUpdate(response.objects));
}
});
}
你在UI线程上用asObservable()
阅读:
public Subscription readFromRealm() {
return realm.where(SomeObject.class)
.findAllAsync()
.asObservable()
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.filter(RealmResults::isLoaded)
.subscribe(objects -> adapter.updateData(objects));
}
将Realm与RxJava一起使用
对于查询,Realm提供realmResults.asObservable()
方法。只能在looper线程(通常是UI线程)上观察结果。
要使其正常工作,您的配置必须包含以下内容
realmConfiguration = new RealmConfiguration.Builder(context) //
.rxFactory(new RealmObservableFactory()) //
//...
.build();
之后,您可以将结果用作可观察的结果。
Observable<RealmResults<SomeObject>> observable = results.asObservable();
对于异步查询,您应该按isLoaded()
过滤结果,以便仅在查询执行时才收到事件。同步查询不需要filter()
isLoaded()
始终在同步查询中返回true
。
Subscription subscription = RxTextView.textChanges(editText).switchMap(charSequence ->
realm.where(SomeObject.class)
.contains("searchField", charSequence.toString(), Case.INSENSITIVE)
.findAllAsync()
.asObservable())
.filter(RealmResults::isLoaded) //
.subscribe(objects -> adapter.updateData(objects));
对于写入,您应该使用executeTransactionAsync()
方法,或者在后台线程上打开Realm实例,同步执行事务,然后关闭Realm实例。
public Subscription loadObjectsFromNetwork() {
return objectApi.getObjects()
.subscribeOn(Schedulers.io())
.subscribe(response -> {
try(Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction(realm -> realm.insertOrUpdate(response.objects));
}
});
}