android - rxjava Realm - 使用 UI 线程以外的其他处理程序线程的灵活性?

标签 android realm rx-java

在阅读了 Realm 的文档(非常好,赞一个)之后,目前我想到的是:

  1. realm需要handler线程来操作,UI线程就完美了
  2. 如果您不想通过在 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();

目前遇到的两个问题:

  1. 当我从 UI 线程取消订阅时,应用程序会崩溃,因为根据 RealmObservableFactory,当取消订阅时,必须在 UI 线程 中删除更改监听器。在我看来,我们无法更改将在哪个调度程序上执行以下内容,而且 Realm 不允许跨线程访问/修改,因此崩溃。

    subscriber.add(Subscriptions.create(new Action0() {
        @Override
        public void call() {
            realm.removeChangeListener(listener);
        }
    }));
    
  2. 我找不到正确关闭 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/

相关文章:

java - Android 客户端使用 Java 套接字连接到 PC 上的服务器

android - 使用回调/监听器链接 RxJava 可观察对象

javascript - Realm.objects() 在 React Native 上返回空对象

ios - RealmJS : clang: error: linker command failed with exit code 1 (use -v to see invocation)

android - Retrofit + RxJava 链接多个请求并聚合结果

java - 如何使用 RxJava 取消 Retrofit 中的单个网络请求?

android - 如何使用 Android 文档的多个字段在 Firestore 中进行搜索?

java - Realm - 混合来自不同项目的模型

android - 在 RxJava2 中将 Listener 转换为 Single

java - 从 Firebase 实时数据库获取计数器值的问题