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()