我正在使用rxjava,retrofit2,okhttp3。
我只是把Log.d看看它是如何工作的,Log就像下面一样。
1. D/-- NetPresenter: checkConnectivity
2. D/-- NetPresenter: Observable
3. D/-- NetPresenter: onNext
4. D/-- MessageSetter: setMessage
5. D/-- MainActivity setText: setText
6. D/-- NetPresenter: onCompleted
7. D/-- NetChecker: onError
8. D/-- error msg: failed to connect to /192.168.0.27 (port 8081) after 5000ms
在获取由onError设置的值“code”之后应该设置TextView。
这意味着#7应该在#5之前处理。
我认为这是因为请求连接时超时选项,但我不知道在哪里修复。
有人能帮我解决一下吗?
感谢。
第1课。
public void checkConnectivity(Context context) {
Log.d("-- NetPresenter", "checkConnectivity");
this.context = context;
myObservable.subscribe(mySubscriber);
}
private Observable<Integer> myObservable = Observable.create(
new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> sub) {
Log.d("-- NetPresenter", "Observable");
int connType = cc.getConnectionStatus(context);
sub.onNext(connType);
sub.onCompleted();
}
}
);
private Subscriber<Integer> mySubscriber = new Subscriber<Integer>() {
@Override
public void onNext(Integer connType) {
Log.d("-- NetPresenter", "onNext");
int code = nc.netChecker(connType);
view.updateReceivedMessageTextView(ms.setMessage(code));
}
@Override
public void onCompleted() {
Log.d("-- NetPresenter", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("-- NetPresenter", "onError");
}
};
第2课。
public int netChecker(int connType) {
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(ApiService.API_URL)
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
Observable<Response<ResponseBody>> result = apiService.getData("database");
result.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<ResponseBody>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if(connType/10 == 0) code = 0;
else code = connType+1;
Log.d("-- NetChecker", "onError");
Log.d("-- error msg", e.getMessage());
}
@Override
public void onNext(Response<ResponseBody> response) {
Log.d("-- NetChecker", "onNext");
Log.d("message", response.message());
Log.d("code", "code :"+ response.code());
code = connType;
}
});
return code;
}
答案 0 :(得分:1)
您可以使用.doOnError()方法对错误执行某些操作。 还有另一种方法.onErrorReturn(),它拦截错误并返回一些值,因此序列不会终止。您可以使用这两种方法。
答案 1 :(得分:0)
RxJava的优点是异步的。您无法预测评估顺序。我相信你应该从&#34; onError&#34;到达MainActivity。方法。我明白了,你以某种方式使用MVP模式。它应该有所帮助。如果您提供有关课程关系的更多信息,我可以说更多。