【问题标题】:RxJava2 + Retrofit 2 Sequential API Call getting error NetworkOnMainThreadException [duplicate]RxJava2 + Retrofit 2 顺序 API 调用出现错误 NetworkOnMainThreadException [重复]
【发布时间】:2018-12-29 09:00:19
【问题描述】:

我有依赖于服务 A 响应的 ServiceB,ServiceB 被触发,但现在我遇到了 NetworkOnMainThreadException @ onError 的错误。我是 RxJava 新手,刚刚开始尝试示例。请帮忙,谢谢。

        ServiceA
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap(new Function<ResponseA, Observable<ResponseB>>() {
            @Override
            public Observable<Execution> apply(ResponseA responseA) throws Exception {
                return ServiceB(responseA.some_id); #ServiceB gets triggered here
            }
        })
        .subscribe(new Observer<ResponseB>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onComplete() {
            }

            @Override
            public void onError(Throwable t) {
               #NetworkOnMainThreadException!
            }

            @Override
            public void onNext(ResponseB responseB) {

            }
        });

【问题讨论】:

  • onComplete()onNext方法中触发服务
  • @ping 将你的 flatmap(...) 放在 observeOn() 之前,一切都会好起来的。
  • 谢谢@MRah 你是对的,它解决了问题!

标签: android rx-java retrofit rx-java2


【解决方案1】:

当您尝试从 UI 线程连接到 url 时会发生 NetworkOnMainThreadException,在您的情况下,您需要将堆栈跟踪放在问题中,请注意服务将在创建的线程上运行,所以如果你从 UI 线程调用它,服务将在 UI 线程上运行。为了避免错误发生,您可以使用许多方法,包括 AsyncTask

AsyncTask.execute(new Runnable(

     @Override
     public void onRun(){
       //do the network job here
     }
 });

【讨论】:

  • AsyncTask 未被弃用,正如我所说,需要更多信息才能找到问题来源
  • 明确提到了源,因为 OP 在第一个 api 调用线程中请求第二个服务
猜你喜欢
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2019-11-05
  • 1970-01-01
  • 2017-10-01
  • 2019-06-22
相关资源
最近更新 更多