Asynctask状态&&取消RxJava2 Observable中的等效项?

时间:2017-10-10 18:02:01

标签: android rx-java observable rx-java2 publishsubject

我正在尝试学习RxJava2,并将我的AsyncTasks转换为Observables。

我正在尝试转换以下代码。

if(asyncTask.getStatus() == AsyncTask.Status.RUNNING){
    asyncTask.cancel();
}
asyncTask = new CustomTask();  
asyncTask.execute(input);

我尝试使用Disposables重新创建以下内容。

Disposable currentTask;
PublishSubject input = PublishSubject.create();

对于每个输入

if(currentTask != null) currentTask.dispose();

currentTask = input
    .map(// Network calls
         // returns CustomObject)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(result -> {
               // do work with result
               }, throwable -> Log.e(TAG, throwable.toString()));

但是,currentTask始终为 null 。为什么?这是错误的做法吗?

1 个答案:

答案 0 :(得分:0)

您正确使用Disposable,但我只能假设您在某个主题上弄乱了。 rx中的主题可以是发布者和订阅者......并且主体不必等到subscribe(...)开始发出项目。出于这个原因,我不建议用任何类型的AsyncTask替换你的Subject

尽管如此,你可以得到类似的,更确定的行为:

Observable<CustomObject> networkObservable =
            Observable.create(emitter ->
                    {
                        try {
                            CustomObject object = doNetworking();
                            emitter.onNext(object);
                            emitter.onComplete();
                        } catch (Exception e) {
                            emitter.onError(e);
                        }
                    }
            );

if(currentTask != null) currentTask.dispose();

currentTask = networkObservable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        // this next subscribe is similar to AsyncTask.execute() as it starts the stream
        .subscribe(result -> {
            // do work with result
            }, throwable -> Log.e(TAG, throwable.toString()));

此外,考虑调查SerialDisposable,你不必做那些空/处置检查

SerialDisposable serialDisposable = new SerialDisposable();
  

原子地:在此容器上放置下一个一次性物品并处理前一个容器(如果有的话),或者如果容器已经处理掉,则将其丢弃。

Disposable disposable = networkObservable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(...);

serialDisposable.set(disposable); // this will call dispose on the previous task if it exists