私は、まずデータをキャッシュからダウンロードし、サーバAPIからデータを要求し、その結果を保存し、ネットワークデータから与えられたデータをプレゼンタ(MVP) 。RxJava 2とIOスレッドでRealmと連携する
Realmでの作業は、UIスレッドでバックグラウンドで作業したい場合に発生します。最初のRxJavaの領域サポートについての記事をいくつか見つけましたが、別のAPIを持つ2番目のバージョンを使用しているため、これらの領域メソッドは私たち(toObservable())には役に立ちません。
この問題を解決するにはどうすればよいですか?
さらに、他のすべてのメソッドはIOスレッドで処理され、という事実にかかわらず、RealmだけがUiで動作します。それはなぜ起こるのですか?まあ
@Override
public Observable<ChatsRepoAnswerModel> getChats() {
return getChatsFromCache(STATUS_OK)
.subscribeOn(Schedulers.io())
.mergeWith(
getChatsService()
.getChats()
.subscribeOn(Schedulers.io())
.map(ChatResponseModel::getResult)
.flatMap(mChatsMapper::transformAll)
.doOnNext(this::saveChats)
.doOnNext(Collections::sort)
.onErrorResumeNext(getChatsFromCache(STATUS_ERROR))
.observeOn(AndroidSchedulers.mainThread());
}
private void saveChats(List<ChatDataModel> realmObjects) {
Realm.getDefaultInstance().executeTransaction(realm -> {
realm.insertOrUpdate(realmObjects);
});
}
private Observable<ChatsRepoAnswerModel> getChatsFromCache(int aStatus) {
Realm realm = Realm.getDefaultInstance();
RealmResults<ChatDataModel> chats = realm.where(ChatDataModel.class).findAll();
return processChatResponse(realm.copyFromRealm(chats), aStatus);
}
レルムが提供する観測可能なデータセットを観察しているはずなので、この問題が発生しています。 [無作為のネットワークデータを送信し、反応ゼロコピー遅延評価主導型データベースからすべての要素を切り離して熱心にコピーしようとするのではなく](https://medium.com/@Zhuinden/すべてのクエリは、スレッドを使用したスレッドを使用してオブジェクトを分離する方法をプロフェッショナルに悪用します(realm-and-56683dbdeaf9)。 – EpicPandaForce
いくつかの説明リンクを追加できますか?なぜ私はsubscribeOn追加のスレッドとこれはレルムで動作しません他のメソッドを使用することはできますか? – Gaket
UIスレッドにバインドされたRealmインスタンスからバックグラウンドスレッドを読み取ろうとしているためです。しかし、私はこの物に関する記事を追加しました。恐らく、あなたがRealmインスタンスを閉じていないのに、 – EpicPandaForce