当前位置: 首页 > 知识库问答 >
问题:

Realm+Retrofit+RxJava:Concat和SubscribeOn

张鸿志
2023-03-14

我在使用RxJava concat运算符时遇到了一个问题。我有两个可观察项,第一个从服务器数据库发出结果,另一个从本地数据库发出结果,然后我将:

// Uses a Realm in the UI thread
Observable<MyResult> remoteObservable = mRemoteDataSource.find(tId);

// Uses Retrofit
Observable<MyResult> localObservable = mLocalDataSource.find(tId);

Observable.concat(localObservable, remoteObservable)
    .doOnNext(result -> /* Do my stuff */)
    .observeOn(AndroidSchedulers.mainThread())
    .doOnError(throwable -> throwable.printStackTrace())
    .subscribe()

因此,这给我带来了问题,因为我没有使用subscribeon()连接的observable是在AndroidScheduler.mainthread()上运行的,这不运行远程,它启动了NetworkOnMainThreadException

如果我实现了订阅(scheduleers.computation()),我将从不正确的线程获得领域访问。领域对象只能在创建它们的线程上访问,因为Observable当然不在存在领域实例的线程上运行。

我已经搜索了其他问题,但没有得到任何有用的信息,我检查了由realm创建的示例:https://github.com/realm/realm-java/blob/master/examples/rxjavaexample/src/main/java/io/realm/examples/rxjava/retrofit/retrofitexample。java但是奇怪的是,我发现refitfit observable没有订阅任何内容,而且它可以工作。

为什么它在示例中起作用,而在我的代码中却不能这样做?有什么建议吗?

共有1个答案

益富
2023-03-14

我认为您应该在正确的位置使用subscribeon()

// Uses a Realm in the UI thread
Observable<MyResult> realmObservable = mRealmDataSource.find(tId).subscribeOn(AndroidSchedulers.mainThread());

// Uses Retrofit
Observable<MyResult> retrofitObservable = mRetrofitDataSource.find(tId).subscribeOn(Subscribers.io());

Observable.concat(realmObservable, retrofitObservable)
    .doOnNext(result -> /* Do my stuff */)
    .subscribeOn(AndroidSchedulers.mainThread())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnError(throwable -> throwable.printStackTrace())
    .subscribe()

看看它是否能解决你的问题。

 类似资料:
  • Realm 是一个移动数据库,可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。 目前支持 iOS/OS X/Android 平台,提供 Swift/Objective-C/Java 语言的 API: // Optional: turn off persistenceRLMRealm.useInMemoryD

  • 所以我试图弄清楚如何使用Realm,Moya和ObjectMapper。 我使用Moya向我的API发出请求。我使用Realm将返回的数据保存在本地数据库中。并且我使用ObjectMapper将JSON对象映射到校正领域变量。 然而,现在我遇到了一个问题,我不确定如何解码JSON响应以便将其通过映射器。 下面是我的莫亚密码: 错误发生在这一行: 类如下所示: 我明白为什么我会犯这个错误,但我不知道

  • Realm is a mobile database that runs directly inside phones, tablets or wearables.This repository holds the source code for the Java version of Realm, which currently runs only on Android. Realm Kotli

  • 一个用于Stetho的Realm模块:可以通过Stetho,在Chrome浏览器上查看Realm数据库。 使用方法: 1. 在您的build.gradle文件中添加: repositories {    maven { url "https://jitpack.io" }}dependencies {    compile 'com.facebook.stetho:stetho:1.5.0'   

  • Realm 是手机数据库,是 Core Data 和 SQLite 的替代品。

  • retrofit 是一个适用于 Android 和 Java 的类型安全的 HTTP 客户端。