Android RxJava主线程总是崩溃
我有两个连续的API调用,所以我决定使用RxJava flatmap来完成它,如下代码所示: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())
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() {
}
});
在observeronError
方法中,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
}