使用rxjava和dagger2跨线程访问领域

pat*_*pat 6 java multithreading android realm

我已经阅读了很多关于这个主题的帖子,但对我来说还是有点不清楚.我知道你不能Realm跨不同的线程访问类或领域对象,所以我想知道处理它的最佳方法是什么.

我有一个启动线程的服务.该线程执行后台工作(包括通过rxjavaon 工作Schedulers.io).现在在某一点上,我想将一些数据保存到存在于DataManager类中的领域.最初我Dagger2用来注入Realm我的DataManager类(它本身被注入到服务中).但是这不起作用,因为注入是在主线程上完成的,因此Realm.getDefaultInstance()绑定到主线程但是在DataManager中从不同的线程访问它.

我能想到的唯一可行的选择是调用Realm.getDefaultInstance()realm.close()在每个执行事务的方法的开头和结尾.我不介意这样做,但我想知道Realm.getDefaultInstance()每次我想要保存对象时是否会有性能命中.有一个更好的方法吗?提前致谢.

Sha*_*med 0

我在一个应用程序中使用 Realm 时解决了线程问题,方法是创建一个DatabaseManager类,并使用 Dagger 2 将其注入到 Activity 和 Services 中。

例如,如果我有一个实体Task,该类DatabaseManager有一个方法void update(Task task)可以获取默认的 Realm 实例,Task从 Realm 数据库中获取给定的 ID,更新Task事务块中获得的实例,realm.copyFromRealm(updatedTask);最后执行并关闭 Realm 实例的方法。

Realm realm = Realm.getDefaultInstance();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                // fetch the object from Realm database and update it as required.

                //https://realm.io/docs/java/latest/api/io/realm/Realm.html#copyFromRealm-E-
                // Makes an unmanaged in-memory copy of an already persisted RealmObject.
                realm.copyFromRealm(task);

                }
            }
        });
realm.close();
Run Code Online (Sandbox Code Playgroud)

这对我有用。如果有更好的方法我想了解更多。