RxAndroid带参数化AsyncTask

时间:2015-09-18 07:32:55

标签: 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, 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是否正确?

2 个答案:

答案 0 :(得分:7)

由于您想使用RxJava,因此您不再需要AsyncTask。您可以使用subscribeOnobserveOn重写代码,如下所示:

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
            });
}

答案 1 :(得分:0)

基于上面的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()
    );