具有参数化异步任务的RxAndroid
我想用rxAndroid重写这个项目。 在我的代码中,我有一个简单的部分:具有参数化异步任务的RxAndroid,android,android-asynctask,rx-java,rx-android,Android,Android Asynctask,Rx Java,Rx Android,我想用rxAndroid重写这个项目。 在我的代码中,我有一个简单的部分: public void chkLogin(String login, String password) { String[] myTaskParams = { login, password }; new ChkLoginTask().execute(myTaskParams); } private class ChkLoginTask extends AsyncTask<String, Void
public void chkLogin(String login, String password) {
String[] myTaskParams = { login, password };
new ChkLoginTask().execute(myTaskParams);
}
private class ChkLoginTask extends AsyncTask<String, Void, LoginStatus> {
@Override
protected void onPreExecute(){
view.showLoadingSpinner();
}
@Override
protected LoginStatus doInBackground(String... params) {
return app.getAPI().checkLogin(params[0], params[1]);
}
@Override
protected void onPostExecute(LoginStatus result) {
view.hideLoadingSpinner();
if(result == null)
view.onConnectionError();
else{
view.onChkLoginSuccess(result);
}
}
}
public void chkLogin(字符串登录,字符串密码){
字符串[]myTaskParams={login,password};
新建chklogingtask().execute(myTaskParams);
}
私有类chklogingtask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
view.showLoadingSpinner();
}
@凌驾
受保护的登录状态doInBackground(字符串…参数){
返回app.getAPI().checkLogin(参数[0],参数[1]);
}
@凌驾
受保护的void onPostExecute(LoginStatus结果){
view.hideLoadingSpinner();
如果(结果==null)
view.onConnectionError();
否则{
view.onchkloginssuccess(结果);
}
}
}
在这段代码中,我只需在AsyncTask中使用两个参数调用我的api方法,然后通过视图对其结果作出反应
现在我想用rxAndroid写这段代码,但我被困在上面了。。。我知道rx如何在UI元素上使用react,但找不到关于它如何使用参数化AsyncTask的信息
在这种情况下使用RX正确吗?因为您想使用RxJava,所以不再需要AsyncTask。您可以使用
subscribeOn
和observeOn
重写代码,如下所示:
public void chkLogin(String login, String password) {
view.showLoadingSpinner();
Observable.defer(() -> Observable.just(app.getAPI().checkLogin(login, password)))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
view.hideLoadingSpinner();
if (result == null)
view.onConnectionError();
else {
view.onChkLoginSuccess(result);
}
}, e -> {
// handle the exception
});
}
基于上面的异步任务代码,将其转换为Rx
String[] myTaskParams = { login, password };
Observable
//Pass login and password array
.just(myTaskParams)
//Array is received below and a api call is made
.map(
loginCredentials -> app.getAPI().checkLogin(loginCredentials[0], loginCredentials[1])
)
.doOnSubscribe(disposable -> view.showLoadingSpinner())
.doOnComplete(() -> view.hideLoadingSpinner())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> result == null ? view.onConnectionError() : view.onChkLoginSuccess(result),
error -> view.onConnectionError()
);
可能需要保留
订阅
并在onPause
或onDestroy
中取消订阅,以防止内存泄漏。