【问题标题】:How to perform operations in different thread then notify main thread in rxandroid?如何在不同的线程中执行操作然后通知rxandroid中的主线程?
【发布时间】:2016-08-25 20:39:31
【问题描述】:

我非常了解订阅的概念(subscribeOn 以下的任何代码都将在该特定线程中执行)并在 rxandroid/rxjava 中观察(与 subscribeOn 相同)。

我想要发生的是在后台线程中执行长 io 操作,然后在操作完成时通知主线程。为此,我正在考虑在Schedulers.io() 中订阅flatmap,然后在AndroidSchedulers.mainThread() 中观察subscribe,如下所示:

Observable.just(1)
          .subscribeOn(Schedulers.io())
          .flatMap(o -> {
            longIO();
            return null;})
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(//i want to notify user here);

这实际上是在另一个线程中执行longIO(),因此不会阻塞主线程,我的问题是,这不会通知主线程longIO()已经完成,注意android不允许通知如果不在主线程中,则通过创建 ToastAlertDialog 来创建用户。代码好像没有通过subscribe

注意:我使用了just(1),尽管我不使用整数1,因为我希望执行flatMap 中的方法。如果我使用empty 它不会通过flatMap

【问题讨论】:

标签: android rx-java rx-android


【解决方案1】:

flatMap 的返回类型为Observable。如果flatMap 返回一个空的Observable,订阅者将不会收到通知。将return语句改为return Observable.just(null);

但是,最好使用Observable.fromCallable() 来包装您的longIO() 方法,这样just(1) 就会过时并且代码看起来更简洁。注意:fromCallable() 的返回类型不是Observable,因此即使返回了null,订阅者也会收到通知。它看起来像:

Observable.fromCallable(() -> {
        longIO;
        return null;
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(

【讨论】:

    【解决方案2】:

    我认为你在几件事上是错误的。 IMO 以上subscribeOn() 的所有内容都将在线程池中的特定线程中完成。当然,observeOn 以下的所有内容都应该传递给 UI 线程。

    第二件事 - 你不能执行你的 flatMap 运算符返回 null。您需要返回Observable。如果您不需要传递数据,您可以使用:Observable.just(null) or Observable.never()

    我认为更好的解决方案是:

    Observable.create(new Observable.OnSubscribe<Object>() {
        @Override
        public void call(final Subscriber<? super Object> subscriber) {
            longIO();
            }
        })
        .startWith(new Object()) //if you want to run it once
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe();
    

    【讨论】:

      猜你喜欢
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多