Rx 中的领域访问可观察错误



当我尝试在领域实例上进行操作时出现错误,如下所示:

.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结构。

最新更新