2016-10-28 98 views
0

我得到了一個小問題,我使用RxJava從服務器檢索數據,然後檢查那些與本地數據,問題我開始在本地檢查文件和存儲數據,然後我在數據完全下載之前啓動可見性,我得到SUCCESS,然後在成功後收到「initRemoteData」結果。Async Observable裏面異步Observable

所以我需要做的就是當observable讓結果繼續時,當我調用「InitRemoteData」時阻止observable。

private Observable<CheckStatus> getCheckObservable() { 
    return Observable.defer(() -> { 
     DataDTO dto; 
     try { 
      dto = Utils.decryptData(
       localfile.getNonce(), 
       localfile.getEncryptedData(), 
       password); 
     } catch (WrongPasswordException e) { 
      return Observable.just(CheckStatus.WRONG_PASSWORD); 
     } 
     try { 
      storeDataPrefs(dto); 
     } catch (RuntimeException e) { 
      return Observable.just(CheckStatus.OTHER_ERROR); 
     } 
     storeDatabase(dto); 

     initRemoteData();//<-Here i did call for another observable but the observable keep going without waiting it to finish. 



     return Observable.just(CheckStatus.SUCCESS); 
    }); 
} 

可觀察召喚:

getCheckObservable() 
     .subscribeOn(BackgroundSchedulers.getMultiThreadInstance()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(Subscribers.create(checkResult -> replaceFragment(
      CheckAccountCompleteFragment 
       .newInstance(checkResult), 
      AddToBackStack.FALSE))); 

UPDATE: initRemoteData代碼:

Observable.zip(getObservable1()),//remote Data 
      getObservable2(), // local Data 
      (observableResult1,observableResult2)->{ 
       doSomethingWith(observableResult1,observableResult2); // compare between data 
       return null; 
      }).subscribeOn(BackgroundSchedulers.getMultiThreadInstance()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnCompleted(() -> { 
        doSomething2(); // update fields 
       } 
      }) 
      .subscribe(); 

回答

2

,如果我得到正確,您需要做getCheckObservable()等待兩個結果?如果是:Observable.combineLatest()可以幫助你。

UPDATE: 好吧,那爲什麼不直接return這種 「等待」 可觀察的 「大」 一個 像這樣:

Observable.zip(getObservable1()),//remote Data 
     getObservable2(), // local Data 
     (observableResult1,observableResult2)->{ 
      doSomethingWith(observableResult1,observableResult2); // compare between data 

      return CheckStatus.SUCCESS; // <-- CHANGES 

     }).subscribeOn(BackgroundSchedulers.getMultiThreadInstance()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnCompleted(() -> { 
       doSomething2(); // update fields 
      } 
     }); 
在getCheckObservable

而且

+0

我已經調用一個可觀察「initRemoteData」是一個獨立的功能,但我需要一些數據,在getCheckObservable()的整個執行後它可能會完成的問題「initRemoteData」它不會導致主要功能的問題,但它可能是b etter如果我做得正確:p – Gofurs

+0

我不知道我是否正確地得到你。你可以分享'initRemoteData()'代碼嗎? –

+0

我推出了一些簡化的代碼,但足夠了解這個想法 – Gofurs