2016-08-14 72 views
1

我有一個Observable鏈和一個對話框,在完成所有事情後都會關閉。命令是這樣的: 1 api call get ResponseBody 2 take response body process (不是UI線程) 3其他進程(不是UI線程)Observable concatMap在主線程上執行某些操作

在第一次調用期間,對話框沒問題,當涉及到第二個,並且我收到第一個調用的主體時,對話框被阻止,並保持爲是剩下的時間。

最後一切都完成後,但我收到一條警告,說「該應用程序在主線程上做了很多工作」。

我沒有在主線程上做任何事情,所以我不太瞭解如何解除阻塞對話框並將所有內容保留在單獨的線程中。

showLoadingDialog(); 

     mZappAppApis.downloadDatabase(Token.getToken(AppConfig.TOKEN_SYNC_DOWNLOAD_DATABASE)) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .concatMap(new Func1<ResponseBody, Observable<String>>() { 
        @Override 
        public Observable<String> call(ResponseBody responseBody) { 
         return mDatabaseFileHelper.writeDatabaseToFile(responseBody); 
        } 
       }) 
       .concatMap(new Func1<String, Observable<String>>() { 
        @Override 
        public Observable<String> call(String s) { 
         return mDatabaseFileHelper.copyDatabaseIntoZappApp(); 
        } 
       }) 
       .subscribe(new Subscriber<String>() { 
        @Override 
        public void onCompleted() { 
         dismissLoadingDialog(); 

         saveLocalTimestamp(timestamp); 

         flowContinueInterface.onContinueFlow(); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Logger.e(e, "Error during processing new database"); 

         dismissLoadingDialog(); 

         flowContinueInterface.onStopFlow(); 
        } 

        @Override 
        public void onNext(String result) { 
         Logger.d(result); 
        } 
       }); 
+0

從我可以在你的代碼,'dismissProgressDialog()見'只調用2次,'onCompleted()'你觀察者和'onError()',所以你的觀察者的這些方法中的任何一個都被調用,並且如果你認爲在所有處理完成之前進度已經被取消,那麼這意味着調用'onError()',所以在你的'onError()'中加入一個日誌,並尋找錯誤 – Bhargav

回答

2

concatMap工作正在主線程中發生。您需要將observeOn呼叫移至subscribe呼叫的正上方。

我也會將重要的處理從訂戶轉移到doOnCompleteddoOnError呼叫,這些呼叫也位於observeOn之前。

+0

我會接受這個答案,因爲它是第一個在時間方面,並給我一些建議。謝謝,它有效 – dvdciri

1

將您的.observeOn(AndroidSchedulers.mainThread())移動到subscribe(…以上。 您的observeOn(…之後的所有內容都在此線程上執行。 您可以通過打印出當前線程你在看到這一點:

.subscribeOn(Schedulers.newThread()) 
.concatMap(new Func1<String, Observable<String>>() { 
      @Override 
      public Observable<String> call(final String string) { 
        Log.i("Before", Thread.currentThread().toString()); 
        return Observable.just(string); 
       } 
      }) 
.observeOn(AndroidSchedulers.mainThread()) 
.concatMap(new Func1<String, Observable<String>>() { 
      @Override 
      public Observable<String> call(final String string) { 
        Log.i("After", Thread.currentThread().toString()); 
        return Observable.just(string); 
      } 
}) 
... 
相關問題