我是RX的新手,我不知道调度程序是如何工作的。下面是一些从不运行while(true)
的代码。但如果我在最后放置new thread
循环它可以正常工作。它会在运行Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("done");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(String o) {
System.out.println(o);
}
};
Observable.from(new String[]{"1", "2", "3","4"}).
subscribeOn(Schedulers.immediate())
.observeOn(Schedulers.newThread())
.subscribe(subscriber);
之前退出应用程序。
为什么会这样?以及如何解决这个问题?
{{1}}
答案 0 :(得分:3)
如果你的程序过早退出,只需添加Thread.sleep(1000);
作为最后一个语句。
至于为什么会发生这种情况。
This answer语录:
Java虚拟机继续执行线程,直到发生以下任一情况:
...
所有非守护程序线程的线程都已死...
现在,如果我们查看为RxThreadFactory
生成线程的Schedulers
:
public final class RxThreadFactory extends AtomicLong implements ThreadFactory {
...
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, prefix + incrementAndGet());
t.setDaemon(true);
return t;
}
}
因此,更复杂的解决方案是使用Schedulers.from()
并使用自己的Executor
传递自定义ThreadFactory
,以生成非守护程序线程。