我非常理解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
答案 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();