将AsyncTask更改为Rxjava

时间:2019-07-07 09:12:00

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

将AsyncTask doInBackground进程转换为RxJava时遇到了挑战。我很想知道如何将其转换为Rx Java,因为我没有尝试过。

new AsyncTask<Void, Void, Integer>() {
            @Override
            protected Integer doInBackground(Void... voids) {

                return mDAO.getCount();
            }

            @Override
            protected void onPostExecute(Integer count) {
                if (count == 0)
                    mCount.setText("All Notifications");
                else
                    mCount.setText("New Notificaiton "+count);
            }
        }.execute();

我为Rx尝试了这个

Observable<Integer> count = Observable.fromCallable(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return mDAO.getCount();
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
        count.subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                mDisposable.add(d);
            }

            @Override
            public void onNext(Integer integer) {
                if (integer == 0)
                    mCount.setText("All Notifications");
                else
                    mCount.setText("New Notification "+count);

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

我得到这个代替计数

Count io.reactivex.internal.operators.observable.ObservableObserveOn@5ccee5b

我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:0)

您的实现就是为什么出现此错误的原因。您应该改为使用单个可调用对象。这应该可以100%进行,如果您有任何挑战,请告诉我。

Single.fromCallable(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return mDAO.getCount();
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSuccess(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        if (integer == 0)
                            mCount.setText("All Notifications");
                        else
                            mCount.setText("New Notification "+integer);
                    }
                })
                .doOnError(new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                })
                .subscribe();