想要使用来自onError的值,RxJava

时间:2016-11-02 06:55:17

标签: android rx-java retrofit2

我正在使用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;
}

2 个答案:

答案 0 :(得分:1)

您可以使用.doOnError()方法对错误执行某些操作。 还有另一种方法.onErrorReturn(),它拦截错误并返回一些值,因此序列不会终止。您可以使用这两种方法。

答案 1 :(得分:0)

RxJava的优点是异步的。您无法预测评估顺序。我相信你应该从&#34; onError&#34;到达MainActivity。方法。我明白了,你以某种方式使用MVP模式。它应该有所帮助。如果您提供有关课程关系的更多信息,我可以说更多。