2017-10-10 21 views
0

私はRxJava2を学び、AsyncTasksをObservablesに変換しようとしています。Asynctask status && RxJava2で同等のキャンセルが可能ですか?

変換しようとしている次のコードがあります。

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

Disposablesで次のように再作成しようとしました。すべての入力

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

については

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

しかし、currentTaskは常にヌルです。どうして?これは間違った方法ですか?

+0

すべて '(...)購読'メソッドは 'Disposable'を返しません。あなたは少なくともあなたが 'subscribe(...)'に渡すparamをヒントできますか? – Jon

+0

あなたはいつでも 'currentTask'をnullにしようとしていますか?また、 'PublishSubject input'を使っているところに他の場所を追加できますか?私はあなたが主題を悪用していると思われ、あなたの問題を引き起こしています。 – Jon

答えて

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 
関連する問題