【问题标题】:RxJava Android onError takes too long to be calledRxJava Android onError 调用时间过长
【发布时间】:2017-03-30 17:48:45
【问题描述】:

我在我的 Android 应用上使用 RxJava,但 onError 有问题。

我正在这样做:

operationalLayer.operationalConfig(new OperationalRequest())
    .subscribeOn(Schedulers.immediate())
    .observeOn(Schedulers.immediate())
    .subscribe(new CustomSubscriber<OperationalResponse>(bundle, null) {
        @Override
        public void onNext(OperationalResponse response) {
          //Do something
            super.onNext(response);
        }
    });

在某些时候,在operationalConfig 方法中,我检查网络连接是否可用,如果不可用,则返回错误。

public Observable<OperationalResponse> operationalConfig(final OperationalRequest operationalRequest) {
    if (!Network.hasInternet()) {
        Log.d("No available internet for operationalConfig");
        return Observable.error(new NoInternetException());
    }

    return Observable.defer....
}

比,在我的CustomSubscriber 我有这个:

@Override
public void onError(final Throwable e) {
    if (e instanceof NoInternetException) {
        // do something
        Log.d("No internet connection available");
    } 
    // other things
}

查看日志消息我有一个巨大的延迟,因为它检测到没有可用的互联网连接并且调用了onError 方法。

11-16 12:07:37.378 23779-24183 D/CustomTag: OperationalLayer No available internet for operationalConfig
11-16 12:07:57.459 23779-24416 D/CustomTag: CustomSubscriber No internet connection available

知道为什么吗?

【问题讨论】:

  • 您能否删除observeOn并使用Schedulers.io()进行subscribeOn并再次验证结果?
  • @HansWurst 试过,但我相信这需要更多时间。大约从 20 秒到将近 2 分钟
  • 嗯,我没有看到这里有问题。需要更多代码来帮助调试。实际上,将操作配置中的所有内容都包装到 Observable.defer 中,以免阻止订阅。订阅的 onNext 将发生在给定的调度程序上,但进入和检查网络是否可用将发生在当前线程上。
  • 不。一样。没有更多的代码:(
  • 你能把项目发布到 github 或其他什么地方,我将逐步检查代码并查找错误。

标签: android rx-java


【解决方案1】:

找到问题了。

没有在此处发布代码,因为认为它不相关。事实上确实如此。

operationalLayer.operationalConfig 和方法本身之间我有这个:

@Override
    public Observable<OerationalResponse> operationalConfig(OperationRequest operationalRequest) {
        //Something
        return network.opcoConfigs(opcoConfigRequest)
                .retryWhen(//Something);
    }

在我传递给retryWhenFunc 中,我现在正确处理错误,以便在没有网络连接时立即停止重试机制并将InternetException 返回给订阅者。

【讨论】:

猜你喜欢
  • 2018-02-22
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2018-05-15
  • 1970-01-01
  • 2020-05-13
  • 2020-08-15
相关资源
最近更新 更多