我正在使用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);
});
您的线程切换(
subscribeOn
和observeOn
)很好。编辑:
还有一件事:除非
processAndUpdateFeature
或initDefaultValues
或cookieReceived
可以引发错误,否则try-catch
块似乎是不必要的。