在阅读了 Realm 的文档(非常好,赞一个)之后,目前我想到的是:
- realm需要handler线程来操作,UI线程就完美了
- 如果您不想通过在 UI 线程中查询来降低 UI 线程的速度,您可以使用
findAllAsync()
或其他类似的方法,它会在 UI 线程外执行查询并将结果传回到 UI 线程
现在我的问题不仅仅是“我不想在 UI 线程中查询”。我希望能够在我创建的处理程序线程中查询 Realm ,将结果 Observable
与在同一处理程序线程上运行的其他处理器 Observable
链接起来,最后交付处理结果到 UI 线程。主要是因为处理对于 UI 线程来说太昂贵了。
基本上这样的 fragment 看起来像这样:
Observable
.defer(new Func0<Observable<RealmResults<User>>>() {
@Override
public Observable<RealmResults<User>> call() {
Realm realm = Realm.getDefaultInstance();
return realm.where(User.class).findAll().asObservable();
}
})
.map(new Func1<RealmResults<User>, UserUIData>() {
@Override
public UserUIData call(RealmResults<User> users) {
return new UserUIData(users.first());
}
})
.subscribeOn(MY_HANDLER_THREAD_SCHEDULER)
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
目前遇到的两个问题:
当我从 UI 线程取消订阅时,应用程序会崩溃,因为根据
RealmObservableFactory
,当取消订阅时,必须在 UI 线程 中删除更改监听器。在我看来,我们无法更改将在哪个调度程序上执行以下内容,而且 Realm 不允许跨线程访问/修改,因此崩溃。subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { realm.removeChangeListener(listener); } }));
我找不到正确关闭
Realm
实例的方法。
谁能帮我指出正确的方向?我一开始就不应该这样做吗?有没有更好的办法?
非常感谢。
最佳答案
您应该能够像这样使用 unsubscribeOn
/doOnUnsubscribe
的组合(未测试):
AtomReference<Realm> realmRef = new AtomicReference(null);
Observable
.defer(new Func0<Observable<RealmResults<User>>>() {
@Override
public Observable<RealmResults<User>> call() {
Realm realm = Realm.getDefaultInstance();
realmRef.set(realm);
return realm.where(User.class).findAll().asObservable();
}
})
// ...
.doOnOnsubscribe(realmRef.get().close())
.unsubscribeOn(MY_HANDLER_THREAD_SCHEDULER)
.subscribeOn(MY_HANDLER_THREAD_SCHEDULER)
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
我们这里有一个问题,可以更轻松地跨线程移动 RealmQueries。一旦实现,这种情况应该得到更好的处理:https://github.com/realm/realm-java/issues/1955
关于android - rxjava Realm - 使用 UI 线程以外的其他处理程序线程的灵活性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35910510/