简体   繁体   English

具有参数化AsyncTask的RxAndroid

[英]RxAndroid with parameterized AsyncTask

I want to rewrite project using rxAndroid. 我想使用rxAndroid重写项目。 In my code i have this simple part: 在我的代码中,我有这个简单的部分:

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

In this code i just call my api method in AsyncTask with two params and then react by view on it's result. 在这段代码中,我只是使用两个参数在AsyncTask中调用我的api方法,然后通过查看结果来做出反应。

Now I want to write this code using rxAndroid, but I'm stuck on it... I know how rx work with react on UI elements, but can't find information about how it works with parameterized AsyncTask 现在,我想使用rxAndroid编写此代码,但是我被困住了...我知道rx如何与UI元素一起工作,但是找不到有关如何与参数化AsyncTask一起工作的信息

And does it correct to use RX in this case? 在这种情况下使用RX是否正确?

Since you want to use RxJava, you don't need AsyncTask any more. 由于您要使用RxJava,因此不再需要AsyncTask。 You can rewrite your codes using subscribeOn and observeOn like this: 您可以使用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
            });
}

Based on the Async task code above, converting it to Rx. 基于上面的异步任务代码,将其转换为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()
    );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM