2016-08-14 89 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); 
      } 
}) 
... 
相关问题