带参数化 AsyncTask 的 RxAndroid
RxAndroid with parameterized AsyncTask
我想使用 rxAndroid 重写项目。
在我的代码中,我有这个简单的部分:
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);
}
}
}
在这段代码中,我只是用两个参数在 AsyncTask 中调用我的 api 方法,然后通过查看它的结果做出反应。
现在我想使用 rxAndroid 编写这段代码,但我一直坚持下去...我知道 rx 如何对 UI 元素做出反应,但找不到有关它如何工作的信息带参数化的 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
});
}
基于上面的Async任务代码,将其转换为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()
);
我想使用 rxAndroid 重写项目。 在我的代码中,我有这个简单的部分:
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);
}
}
}
在这段代码中,我只是用两个参数在 AsyncTask 中调用我的 api 方法,然后通过查看它的结果做出反应。
现在我想使用 rxAndroid 编写这段代码,但我一直坚持下去...我知道 rx 如何对 UI 元素做出反应,但找不到有关它如何工作的信息带参数化的 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
});
}
基于上面的Async任务代码,将其转换为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()
);