2015-02-09 102 views
3

我有3個連續操作組成的下載過程:preProcess,downloading,postProcess。每個操作具有異步性(preProcess調用API,downloading等待文件下載等)。 UI必須顯示哪些操作正在執行(例如「正在準備...」,「正在下載...」,「解包...」)。 我看到整個過程爲Observable,它發出整個操作的當前狀態。每個操作也是可觀察的,在執行開始時發出其狀態並在執行後完成。如何使用rxJava實現一系列連續操作?

Observable.OnSubscribe<DownloadStatus>() { 
     @Override 
     public void call(Subscriber<? super DownloadStatus> subscriber) { 
      subscriber.onNext(DownloadStatus.PRE_PROCESS); 
      doPreProcess() 
        .subscribe(new Action1<File>() { 
         @Override 
         public void call(File file) { 
          subscriber.onCompleted(); 
         } 
        }); 
     } 
    }); 

    Observable<DownloadStatus> mDonwloadingOperation = Observable.create(new Observable.OnSubscribe<DownloadStatus>() { 
     @Override 
     public void call(final Subscriber<? super DownloadStatus> subscriber) { 
      subscriber.onNext(DownloadStatus.DOWNLOADING); 
      doDownloading() 
        .subscribe(new Action1<File>() { 
         @Override 
         public void call(File file) { 
          subscriber.onCompleted(); 
         } 
        }); 
     } 
    }); 

    Observable<DownloadStatus> mPosProcessOperation = Observable.create(new Observable.OnSubscribe<DownloadStatus>() { 
     @Override 
     public void call(Subscriber<? super DownloadStatus> subscriber) { 
      subscriber.onNext(DownloadStatus.POST_PROCESS); 
      doPostProcess() 
        .subscribe(new Action1<File>() { 
         @Override 
         public void call(File file) { 
          subscriber.onCompleted(); 
         } 
        }); 
     } 
    }); 

一方面每個操作都應該等到以前的操作完成。另一方面,用戶需要接收每個發射狀態(例如,PRE_PROCESS-> DOWNLOADING-> POST_PROCESS-> onComplete)

我不能使用merge,因爲每個操作應該取決於前一個操作的完成。 我不能使用flatMap因爲我不知道如何傳播發射狀態。我認爲Subject可能是解決方案,但我也不知道如何傳播發射狀態。

如何用rxJava解決這個問題?感謝任何想法/線索。

回答

6

concat是你需要的。一旦前一個完成後,它將訂閱連接的observable。

concatMap也可以像flatMap一樣工作,但連接扁平投影。這兩者之間的區別有一個很好的圖here