进行 rxJava 网络调用并根据响应在 UI 线程上推进工作的最佳方法是什么

What is the best way to make a rxJava netwrok call and move work forward on UI thread based on response

我正在使用 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 块似乎是不必要的。

根据我的经验,我最幸运的是使用 AsyncTask 进行网络操作。

有很多优点。 1)使用publish progress显示进度条进度。 2) 你可以在一个地方以一致的方式处理错误,同时让 'success' 流做不同的事情。 3) AsyncTask 是一个 Android 构造,因此您很有可能在不同版本之间一致地工作。