【问题标题】:Observable concatMap does things on the main thread for some reasonsObservable concatMap 由于某些原因在主线程上做事
【发布时间】:2016-08-14 09:53:59
【问题描述】:

我有一个 Observables 链和一个对话框,在所有内容完成后都会关闭。顺序是这样的: 1 api 调用获取 ResponseBody 2 采取响应体过程(不是ui线程) 3个其他进程(不是ui线程)

在第一次通话期间,对话没问题,当涉及到第二次通话时,我收到了第一次通话的正文,对话被阻止,其余时间保持不变。

最后,一切都完成后,但我收到一条警告说“应用程序正在主线程上做很多工作”。

我没有在主线程上做任何事情,所以我真的不明白如何解除对对话框的阻塞并将所有内容都放在单独的线程上。

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);
                    }
                });

【问题讨论】:

  • 从我在您的代码中可以看到,`dismissProgressDialog()` 仅在 2 次被调用,onCompleted() 的观察者和 onError() 因此,观察者的这些方法中的任何一种都是被调用,如果您认为在所有处理完成之前进度被取消,那么这意味着onError() 被调用,所以在您的onError() 中输入日志并查找错误

标签: android multithreading rx-java observable concatmap


【解决方案1】:

concatMap 工作正在主线程上进行。您需要将observeOn 调用移至subscribe 调用上方。

我还将把重要的处理从订阅者转移到doOnCompleteddoOnError 调用中,这些调用也放在observeOn 之前。

【讨论】:

  • 我会接受这个答案,因为它在时间上是第一个,也给我一些建议。谢谢,可以了
【解决方案2】:

将您的.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);
          }
})
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 2022-01-22
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多