具有参数化异步任务的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

我想用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);
        }
    }
}
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
中取消订阅,以防止内存泄漏。