【问题标题】:RxAndroid with parameterized AsyncTask带有参数化 AsyncTask 的 RxAndroid
【发布时间】:2015-09-18 07:32:54
【问题描述】:

我想用 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 是否正确?

【问题讨论】:

    标签: android android-asynctask rx-java rx-android


    【解决方案1】:

    既然你想使用 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
                });
    }
    

    【讨论】:

    • 可能想保留subscription 并取消订阅onPauseonDestroy 以防止内存泄漏。
    【解决方案2】:

    根据上面的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()
        );
    

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多