使用rxjava和dagger2

时间:2016-05-06 21:22:26

标签: java android multithreading realm

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

我有一个启动线程的服务。该线程负责后台工作(包括rxjava上的Schedulers.io工作)。现在在某一点上,我想将一些数据保存到存在于DataManager类中的领域。最初我使用Dagger2Realm注入到我的DataManager类中(它本身被注入到服务中)。但是,由于注入是在主线程上完成的,因此Realm.getDefaultInstance()与主线程绑定,但是在DataManager中从不同的线程访问它,这无法工作。

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

1 个答案:

答案 0 :(得分:0)

我在我的一个应用程序中使用Realm时通过创建DatabaseManager类来解决线程问题,我使用Dagger 2将其注入到Activities和Services中。

例如,如果我有一个实体TaskDatabaseManager类有一个方法void update(Task task),它将获得默认的Realm实例,获取给定的Task来自Realm数据库的ID,更新Transaction块中获取的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();

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