我在 DataManager 中创建了一个方法,它首先从缓存中下载数据,然后从服务器 API 请求数据,保存结果并将给定的网络数据发送给演示者(在 MVP 中)。
问题是当我想在后台线程上使用 Realm 时,它发生在 UI 线程上。我发现了一些关于第一个 RxJava 领域支持的文章,但我们正在使用具有另一个 API 的第二个版本,所以这些领域方法对我们没有帮助(toObservable())。
如何解决问题?
此外,正如我所看到的,所有其他方法都在 IO 线程上处理,并且只有 Realm 在 Ui 上工作,而不管我把subscribeOn(Schedulers.io())
. 为什么会发生?
@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);
}