进行 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);
});
您的线程切换(subscribeOn
和 observeOn
)没问题。
编辑:
还有一件事:除非 processAndUpdateFeature
或 initDefaultValues
或 cookieReceived
可以抛出错误,否则 try-catch
块似乎是不必要的。
根据我的经验,我最幸运的是使用 AsyncTask 进行网络操作。
有很多优点。 1)使用publish progress显示进度条进度。 2) 你可以在一个地方以一致的方式处理错误,同时让 'success' 流做不同的事情。 3) AsyncTask 是一个 Android 构造,因此您很有可能在不同版本之间一致地工作。
我正在使用 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
块似乎是不必要的。
根据我的经验,我最幸运的是使用 AsyncTask 进行网络操作。
有很多优点。 1)使用publish progress显示进度条进度。 2) 你可以在一个地方以一致的方式处理错误,同时让 'success' 流做不同的事情。 3) AsyncTask 是一个 Android 构造,因此您很有可能在不同版本之间一致地工作。