我正在使用rxJava2进行网络呼叫,并且基于响应(成功或错误),我必须继续在UI线程上进行工作。

我已经写了下面的代码。看来工作正常。

       WApi wApi = ServiceGenerator.createService(WApi.class, sURL);
       dataManager = InventoryModule.getDataManager();
       rx.Observable<GetFeature> getFeatureObservable =
       dataManager.executeGetFeature(caseId, wrapperApi);
       if (getCV2FeatureObservable != null) {
           try {

              getFeatureObservable.subscribeOn(Schedulers.io())
                       .observeOn(AndroidSchedulers.mainThread())
                       .doOnError(throwable -> {
                           Log.e(TAG, "Err::" + throwable.getMessage());
                           // init default values because of error response
                           initDefaultValues();
                           // No data to use from WS call. Move forward with
                           //cookie from SSO auth
                           cookieReceived(userID, cookieData, patchNo);
                       })
                       .onErrorResumeNext(rx.Observable.empty())
                       .subscribe(getFeature -> {
                           // use the data from WS response
                           processAndUpdateFeature(getFeature);
                           // move forward with cookie from SSO auth
                           cookieReceived(userID, cookieData, patchNo);
                       });
           } catch (Exception e) {
               Log.e(TAG, e.getLocalizedMessage());
           }
       }


我仍然需要意见,我做对了吗?我想念什么吗?还是可以使用其他运算符使它更好?我将UI工作放置到相应运算符中的方式,它在错误或成功响应中都能正常工作吗?

最佳答案

唯一可疑的选择是您对错误所做的所有复杂处理。

建议不要将逻辑移至doOnError,而不要使用onErrorResumeNext + Subscriber

getFeatureObservable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(getFeature -> {
            // use the data from WS response
            processAndUpdateFeature(getFeature);
            // move forward with cookie from SSO auth
            cookieReceived(userID, cookieData, patchNo);
        }, { throwable -> {
            Log.e(TAG, "Err::" + throwable.getMessage());
            // init default values because of error response
            initDefaultValues();
            // No data to use from WS call. Move forward with
            //cookie from SSO auth
            cookieReceived(userID, cookieData, patchNo);
        });



您的线程切换(subscribeOnobserveOn)很好。



编辑:
还有一件事:除非processAndUpdateFeatureinitDefaultValuescookieReceived可以引发错误,否则try-catch块似乎是不必要的。

07-24 19:04
查看更多