我知道这个问题很多,但我很困惑,阅读这个问题。在我的项目中,我在mvp模式中使用dagger,rx和realm。我有一个带有LoginActivity的应用程序,当用户正确登录时,用户来自此页面中的服务器商店的信息,用户跳转到MainActivity.In MainActivity我想要这个用户信息,但是我收到了这个错误:
java.lang.IllegalStateException:从错误的线程访问Realm。 Realm对象只能在创建它们的线程上访问。
我知道:
Realm从错误的线程访问。 Realm对象只能在创建它们的线程上访问。
在我的Appliction类中,我初始化了DaggerAplicationComponnet。我有applicationModule:
@AppScope
@Component(modules = {ApplicationModule.class, NetworkModule.class , AppRealmModule.class})
public interface ApplicationComponent {
Realm getRealm();
...
}
和AppRealmModule:
@Module
public class AppRealmModule {
@Provides
@AppScope
Realm provideRealm (Context context) {
Realm.init(context);
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.name("Payeshdb")
.build();
Realm.setDefaultConfiguration(realmConfiguration);
return Realm.getDefaultInstance();
}
这意味着,我在ui thread
上创建了realm实例。现在在MainActivity中我已经阅读了领域:
@Override
public Observable<User> findUser() {
return Observable.create(new ObservableOnSubscribe<User>() {
@Override
public void subscribe(ObservableEmitter<User> emitter) throws Exception {
try {
User user = realm.where(User.class).findFirst();
User user1 = realm.copyFromRealm(user);
emitter.onNext(user1);
emitter.onComplete();
}catch (Exception e) {
emitter.onError(e);
}
}
});
}
现在,在演示者中,我正在以这种方式使用rx:
userRepository.findUser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver<User>() {
@Override
public void onNext(User user) {
}
@Override
public void onError(Throwable e) {
// got error: Realm access from incorrect thread.
}
@Override
public void onComplete() {
}
});
这是我遇到错误的地方。在一些帖子中我读过这个:
Use copyFromRealm to get the data from realm which will return them as plain objects rather than realm objects.
我这样做但我仍然有错误。
是否可以使用匕首初始化领域并使用不同的线程进行crud操作?
你的建议是什么?
答案 0 :(得分:1)
@Override
public Observable<User> findUser() {
return Observable.create(new ObservableOnSubscribe<User>() {
@Override
public void subscribe(ObservableEmitter<User> emitter) throws Exception {
try(Realm realm = Realm.getDefaultInstance()) {
realm.refresh();
User user = realm.where(User.class).findFirst();
User user1 = realm.copyFromRealm(user);
emitter.onNext(user1);
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
}
});
}
答案 1 :(得分:0)
正如错误所说
Realm对象只能在创建它们的线程上访问
所以只需订阅你创建的同一个线程Realm
userRepository.findUser()
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())