我正在尝试学习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 。为什么?这是错误的做法吗?
答案 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