Observable getWhere(@NonNull RealmQuery realmQuery)メソッドを持つバックグラウンドスレッドで動作するDBServiceクラスを実装しようとしています。私は同じスレッド上でRealmインスタンスを作成する必要があることを知っているので、私はそれにアクセスします。だから、私はバックグラウンドスレッドでRealmQueryを作成する方法を見つけましたが、その恐ろしいハックです。すべての私の他の試みはjava.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created
バックグラウンドスレッドでRealmQueryを作成
プレゼンターコードの結果:。)
dataUseCase.searchDisk(getRealmQuery(RepoRealm.class)
.equalTo("owner.login", userLogin), RepoRealm.class)
public static getRealmQuery RealmQuery(Class clazz) { // horrible hack
if (handler == null)
handler = new Handler(getHandlerThread().getLooper());
handler.postAtFrontOfQueue(() -> realmQuery = RealmQuery.createQuery(Realm.getDefaultInstance(), clazz));
while (true) if (realmQuery != null) break;
return realmQuery;
}
getHandlerThread(getLooperは()私の唯一のバックグラウンドスレッドを返します。
DBService:
public Observable<List> getWhere(@NonNull RealmQuery realmQuery) {
return Observable.defer(() -> {
Realm realm = Realm.getDefaultInstance();
return realmQuery.findAll().asObservable()
.filter(results -> ((RealmResults) results).isLoaded())
.map(o -> realm.copyFromRealm((RealmResults) o))
.doOnUnsubscribe(() -> closeRealm(realm));
});
}
私は他のアプローチを試みたが、私はいつも間違ったスレッドからレルムへのアクセスの例外を受け取ります。
私の解決策は動作しますが、realmQueryが作成されるまでしばらくの間、私のアプリをフリーズすることができますが、これは避けたいものです。助言がありますか?前もって感謝します。
うん、 'handler.postAtFrontOfQueue)を使用し'とスレッド間でランダムレルム管理対象オブジェクトを投げる、あなたはすでにかなり 'observeOn(AndroidSchedulers.mainThreadを())'持っRxJavaを使用している場合は特にありませんまったく同じことが多いです – EpicPandaForce
PS – EpicPandaForce
この質問に答えるには、Realm **から入手した 'RealmResults'で正確に何をするのかを知る必要があります。 –
EpicPandaForce