compositeDisposable clear 上错误线程的领域访问
Realm access from incorrect thread on compositeDisposable clear
我将在 activity 中订阅的所有观察者添加到 CompositeDisposable。
activity 的 OnStop 正在调用 mCompositeDisposable.clear() 创建以下崩溃日志。
当 CompositeDisposable.clear 调用 onDispose 时,请查看以下代码对 realm
的作用
Single.create(...).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
mCompositeDisposable.add(observer);
在 Schedulers.io()
中创建领域
Single<RealmList<T>> source ...
source .doOnDispose(() -> {
if (mRealm == null) {
return;
}
if (Looper.myLooper() != null) {
mRealm.removeAllChangeListeners();
}
if (!mRealm.isClosed()) {
mRealm.close();
}
mRealm = null;
}
提供以下崩溃日志
java.lang.IllegalStateException: 来自错误线程的领域访问。
Realm access from incorrect thread.
Realm objects can only be accessed on the thread they were created.
at io.realm.BaseRealm.JN(SourceFile:438)
at io.realm.BaseRealm.removeAllListeners(SourceFile:263)
at io.realm.Realm.removeAllChangeListeners(SourceFile:1399)
...
at io.reactivex.internal.operators.single.SingleDoOnDispose$DoOnDisposeObserver.dispose(SourceFile:60)
at io.reactivex.internal.operators.single.SingleDoFinally$DoFinallyObserver.dispose(SourceFile:85)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.dispose(SourceFile:78)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.dispose(SourceFile:78)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.dispose(SourceFile:87)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.observers.DisposableObserver.dispose(SourceFile:91)
at io.reactivex.disposables.CompositeDisposable.a(SourceFile:240)
at io.reactivex.disposables.CompositeDisposable.clear(SourceFile:206)
尝试使用 .unsubscribeOn(Schedulers.io()) 但没有成功
creats realm here in Schedulers.io()
您在 mainThread
中创建 Realm 实例,然后要求 Realm 在 io
线程中操作(例如加载数据),这在 Realm 设计中是不可能的。 Realm 开发人员的示例说明了这里要记住的几点 https://github.com/realm/realm-java/tree/master/examples/rxJavaExample。
将第 1 点和第 4 点实施到您的代码片段中,我们将获得适当的解决方案。请注意,方法 findAllAsync()
将为您异步执行所有操作,无需使用 RxJava
创建 io
线程
Single<RealmList<T>> realmResults = realm.where(....)
.equalTo(...)
.findAllAsync()
.asFlowable()
.map { realmResult->
val realmList = RealmList<T>()
realmList.addAll(realmResult.toList())
return realmList
}
.firstOrError()
realm.close()
我将在 activity 中订阅的所有观察者添加到 CompositeDisposable。 activity 的 OnStop 正在调用 mCompositeDisposable.clear() 创建以下崩溃日志。 当 CompositeDisposable.clear 调用 onDispose 时,请查看以下代码对 realm
的作用Single.create(...).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
mCompositeDisposable.add(observer);
在 Schedulers.io()
中创建领域Single<RealmList<T>> source ...
source .doOnDispose(() -> {
if (mRealm == null) {
return;
}
if (Looper.myLooper() != null) {
mRealm.removeAllChangeListeners();
}
if (!mRealm.isClosed()) {
mRealm.close();
}
mRealm = null;
}
提供以下崩溃日志
java.lang.IllegalStateException: 来自错误线程的领域访问。
Realm access from incorrect thread.
Realm objects can only be accessed on the thread they were created.
at io.realm.BaseRealm.JN(SourceFile:438)
at io.realm.BaseRealm.removeAllListeners(SourceFile:263)
at io.realm.Realm.removeAllChangeListeners(SourceFile:1399)
...
at io.reactivex.internal.operators.single.SingleDoOnDispose$DoOnDisposeObserver.dispose(SourceFile:60)
at io.reactivex.internal.operators.single.SingleDoFinally$DoFinallyObserver.dispose(SourceFile:85)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.dispose(SourceFile:78)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.dispose(SourceFile:78)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.dispose(SourceFile:87)
at io.reactivex.internal.disposables.DisposableHelper.aq(SourceFile:124)
at io.reactivex.observers.DisposableObserver.dispose(SourceFile:91)
at io.reactivex.disposables.CompositeDisposable.a(SourceFile:240)
at io.reactivex.disposables.CompositeDisposable.clear(SourceFile:206)
尝试使用 .unsubscribeOn(Schedulers.io()) 但没有成功
creats realm here in Schedulers.io()
您在 mainThread
中创建 Realm 实例,然后要求 Realm 在 io
线程中操作(例如加载数据),这在 Realm 设计中是不可能的。 Realm 开发人员的示例说明了这里要记住的几点 https://github.com/realm/realm-java/tree/master/examples/rxJavaExample。
将第 1 点和第 4 点实施到您的代码片段中,我们将获得适当的解决方案。请注意,方法 findAllAsync()
将为您异步执行所有操作,无需使用 RxJava
io
线程
Single<RealmList<T>> realmResults = realm.where(....)
.equalTo(...)
.findAllAsync()
.asFlowable()
.map { realmResult->
val realmList = RealmList<T>()
realmList.addAll(realmResult.toList())
return realmList
}
.firstOrError()
realm.close()