Rxjava 计划不会在最后一行之后 运行
Rxjava schedule wont run after last line
我是 RX 的新手,我不知道调度程序是如何工作的。下面是一些永远不会 运行 onComplete
的代码。但是如果我在末尾放置一个 while(true)
循环,它就可以正常工作。它接缝应用程序将在 运行ning 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);
如果您的程序退出得太早,只需添加 Thread.sleep(1000);
作为最后一条语句。
至于为什么会出现这种情况。
This answer 引用:
The Java Virtual Machine continues to execute threads until either of the following occurs:
...
All threads that are not daemon threads have died ...
现在,如果我们查看为 Schedulers
生成线程的 RxThreadFactory
:
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
,从而产生 non-daemon 个线程。
我是 RX 的新手,我不知道调度程序是如何工作的。下面是一些永远不会 运行 onComplete
的代码。但是如果我在末尾放置一个 while(true)
循环,它就可以正常工作。它接缝应用程序将在 运行ning 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);
如果您的程序退出得太早,只需添加 Thread.sleep(1000);
作为最后一条语句。
至于为什么会出现这种情况。
This answer 引用:
The Java Virtual Machine continues to execute threads until either of the following occurs:
...
All threads that are not daemon threads have died ...
现在,如果我们查看为 Schedulers
生成线程的 RxThreadFactory
:
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
,从而产生 non-daemon 个线程。