如何在不同的线程中执行操作然后通知rxandroid中的主线程?

时间:2016-08-25 20:39:32

标签: android rx-java rx-android

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

我想要发生的是在后台线程中执行长io操作,然后在操作完成时通知主线程。要做到这一点,我想在[{1}}订阅flatmap,然后在Schedulers.io()中观察subscribe,如下所示:

AndroidSchedulers.mainThread()

这实际上是在另一个线程中执行Observable.just(1) .subscribeOn(Schedulers.io()) .flatMap(o -> { longIO(); return null;}) .observeOn(AndroidSchedulers.mainThread()) .subscribe(//i want to notify user here); ,因此没有阻塞主线程,我的问题是,这不会通知主线程longIO()已完成,请注意android没有如果不在主线程中,则允许通过创建longIO()Toast来通知用户。代码似乎没有通过AlertDialog

注意:我使用subscribe,即使我不使用整数1,因为我希望执行just(1)内的方法。如果我使用flatMap,则不会通过empty

2 个答案:

答案 0 :(得分:0)

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(

答案 1 :(得分:0)

我认为你在一些事情上是错的。 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();