Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava主线程总是崩溃_Android_Rx Java_Rx Java2 - Fatal编程技术网

Android RxJava主线程总是崩溃

Android RxJava主线程总是崩溃,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我有两个连续的API调用,所以我决定使用RxJava flatmap来完成它,如下代码所示: progress.show(this, "Please Wait ..."); HashMap < String, Object > param = new HashMap < > (); apiClient.getInstance().OPostponed(api_key, param) .subscribeOn(Schedulers.io())

我有两个连续的API调用,所以我决定使用RxJava flatmap来完成它,如下代码所示:

progress.show(this, "Please Wait ...");

HashMap < String, Object > param = new HashMap < > ();

apiClient.getInstance().OPostponed(api_key, param)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .flatMap(new Function < basicRes, Observable < hodRes >> () {

    @Override
    public Observable < hodRes > apply(basicRes basicRes) throws Throwable {
      HashMap < String, Object > param1 = new HashMap < > ();
      return hodClient.getInstance().hodRUpdateStatus("Bearer " + token, param1);
    }

  }).subscribe(new Observer < hodRes > () {

    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull hodRes hodRes) {
      Log.d(TAG, "onNext: " + hodRes.getData());
      progress.dialog.hide();
      Toast.makeText(OrderAddressDetails.this, hodRes.getData(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError(@NonNull Throwable e) {
      Log.d(TAG, "onError: " + e.getMessage());
      progress.dialog.hide();
      Toast.makeText(OrderAddressDetails.this, "Please Check Internet Connection !", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onComplete() {

    }
  });
在observer
onError
方法中,
progress.dialog.hide()
会出现错误!,我注意到,在使用Okhttp日志拦截器的logcat中,两个API请求都返回成功响应,这是完美的,但我不知道为什么会出现错误!另外,我还使用了
.observeOn(AndroidSchedulers.mainThread())
所以为什么我得到了
的第二个例外,只有创建视图层次结构的原始线程才能接触它的视图。
!?我错过了什么


任何帮助都将不胜感激编辑:我误解了这个问题。要避免从错误线程异常调用
请尝试放置

.observeOn(AndroidSchedulers.mainThread())
之后

basicRes
hodRes
类不符合JSON格式


顺便说一句,你的代码很难读。尽量遵守Java惯例。类名应该以大写字母开头。

FlatMap返回一个新的
可观察的
,然后应用
.observeOn(AndroidSchedulers.mainThread())
observed
函数返回的
上,而不是flatMap返回的
observeOn(AndroidSchedulers.mainThread())
在flatMap返回的

apiClient.getInstance().OPostponed(api_key, param)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .flatMap(new Function < basicRes, Observable < hodRes >> () {

    @Override
    public Observable < hodRes > apply(basicRes basicRes) throws Throwable {
      HashMap < String, Object > param1 = new HashMap < > ();
      return hodClient.getInstance().hodRUpdateStatus("Bearer " + token, param1);
    }

  }).observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Observer < hodRes > () {
        // Rest of your code
   }
apiClient.getInstance().opostoned(api_键,参数)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(新功能>(){
@凌驾
公众可观察应用(basicRes basicRes)可丢弃{
HashMapparam1=newhashmap<>();
返回hodClient.getInstance();
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.订阅(新观察员(){
//代码的其余部分
}

如果您在第二个
订阅之前添加订阅并观察,这不会解决问题吗?谢谢,你说得对
hodRes
响应仅与此请求不符合JSON格式谢谢,这确实解决了线程问题
.flatMap(new Function < basicRes, Observable < hodRes >> () {
Expected a string but was BEGIN_ARRAY at line 1 column 10 path $.data
apiClient.getInstance().OPostponed(api_key, param)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .flatMap(new Function < basicRes, Observable < hodRes >> () {

    @Override
    public Observable < hodRes > apply(basicRes basicRes) throws Throwable {
      HashMap < String, Object > param1 = new HashMap < > ();
      return hodClient.getInstance().hodRUpdateStatus("Bearer " + token, param1);
    }

  }).observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Observer < hodRes > () {
        // Rest of your code
   }