当我尝试在领域实例上进行操作时出现错误,如下所示:
.flatMap(h -> Observable.from(h.getEntityDataList())).filter(p -> p.isMyProfile())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ProfileView>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.v("test", "error: " + e.toString());
}
@Override
public void onNext(ProfileView profileView) {
realmManager.saveActiveUser(gson.toJson(profileView));
//...
}
});
领域管理器:
public class RealmManager{
private Realm realm;
public RealmManager(){
realm = Realm.getDefaultInstance();
}
public void saveActiveUser(String json)}{
realm...
}
代码输入到上面的onError()
显示realm objects can only be accessed on the thread they were created
。我正在使用 Dagger 将RealmManager
注入到第一个代码中。
如何克服这一点?使 RealmManager 类化的最佳实践是什么?我应该让 RealmManager 单例(和 Realm 对象是静态的)并在任何地方访问它吗?我应该像上面一样,随时注射吗?
编辑:我正在注入 RealmManager 实例,该实例在单例应用程序组件中提供。
由于 Realm 对象是活动对象,因此您无法在一个线程(IO 线程)上获取它并在另一个线程(主线程)中使用。你可以使用下一个代码(取自 Realm 的文档)来分离这些对象:
realm.where(Person.class).findFirst().<Person>asObservable()
.map(new Func1<Person, Person>() {
@Override
public Person call(Person person) {
// Convert live object to a static copy
return realm.copyFromRealm(person);
}
})
.buffer(2)
.subscribe(new Action1<List<Person>>() {
@Override
public void call(List<Person> persons) {
// Without `map` and `copyFromRealm`, v1 and v2 would be the same
Person v1 = persons.get(0);
Person v2 = persons.get(1);
}
});
使用带有dagger的Realm并不像我想要的那么顺利。
你不应该忘记关闭 Realm。否则,您的应用程序更有可能被系统杀死(在资源不足的情况下)。
Realm.getInstance()
为每个线程创建实例。而且你不能在一个线程中创建 Realm 并在另一个线程中使用它。
我认为最好的选择是使用 DI 的范围。但作为一个快速的解决方案,你可以尝试在dagger的模块中Provider<Realm> realmProvider
结构。