我读过很多关于这个主题的文章,但我仍然有点不清楚。我知道你不能跨不同的线程访问Realm
类或领域对象,所以我想知道处理这个问题的最佳方法是什么。
我有一个启动线程的服务。该线程执行后台工作(包括通过rxjava
对Schedulers.io
进行的工作)。现在,在某一点上,我想将一些数据保存到DataManager类中的领域。最初,我使用Dagger2
将Realm
注入到我的DataManager类中(该类本身已注入到服务中)。然而,这是不起作用的,因为注入是在主线程上完成的,所以Realm.getDefaultInstance()
绑定到主线程,但它在DataManager中从不同的线程访问。
我能想到的唯一可行的选项是在执行事务的每个方法的开头和结尾调用Realm.getDefaultInstance()
和realm.close()
。我不介意这样做,但我想知道每次我想保存对象时调用Realm.getDefaultInstance()
是否会影响性能。有更好的方法吗?提前谢谢。
在我的一个应用程序中使用Realm时,我通过创建一个DatabaseManager
类来解决线程问题,我使用Dagger 2将该类注入到Activities and Services中。
例如,如果我有一个实体Task
,DatabaseManager
类有一个方法void update(Task task)
,它将获得默认的Realm实例,从Realm数据库中获取具有给定ID的Task
,更新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();
这对我很有效。如果有更好的方法,我想知道更多。