2016-08-14 3 views
1

Observablesのチェーンがあり、すべてが終了した後に終了するダイアログがあります。 1 api call get ResponseBody 2レスポンスボディプロセスを取る 他の3つのプロセス(UIスレッドではない)Observable concatMapは何らかの理由でメインスレッド上のものを実行します

最初の呼び出しでは、ダイアログが正常に表示され、2番目の呼び出しでダイアログがブロックされ、最初の呼び出しの本文が表示されます。残りの時間です。

すべてが完了した後、最後に警告が表示されます。「アプリケーションはメインスレッドで多くの作業をしています。

私はメインスレッドで何もしていないので、どのように私はダイアログをブロック解除し、すべてを別のスレッドに保つことができるのか分かりません。

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コールのすぐ上に移動する必要があります。

私はまた、observeOnの前に置かれているdoOnCompleteddoOnErrorコールに加入者からの重要な処理を移動します。

+0

私はこの答えを受け入れるつもりです。ありがとう、それは動作します – dvdciri

1

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); 
      } 
}) 
... 
関連する問題