我正在努力使用Socket.io实现RxJava。我有一个问题,再次订阅相同的observable,所以我做了一个例子和更清晰的代码来理解。
这是功能:
private void testObservable() throws InterruptedException {
io.reactivex.Observable observable = io.reactivex.Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0; i < 20; i++) {
java.lang.Thread.sleep(100);
e.onNext(i);
Timber.d("TESTOBSERVER emit %d", i);
}
e.onComplete();
}
});
DisposableObserver observer = new DisposableObserver<Integer>() {
@Override
public void onNext(Integer value) {
Timber.d("TESTOBSERVER observed: %d", value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(observer);
Timber.d("TESTOBSERVER subscribe 1");
java.lang.Thread.sleep(500);
observer.dispose();
Timber.d("TESTOBSERVER dispose 1");
java.lang.Thread.sleep(500);
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(observer);
Timber.d("TESTOBSERVER subscribe 2");
java.lang.Thread.sleep(500);
observer.dispose();
Timber.d("TESTOBSERVER dispose 2");
}
这是打印的内容
06-07 15:02:49.851 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER subscribe 1
06-07 15:02:49.951 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 0
06-07 15:02:50.051 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 1
06-07 15:02:50.161 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 2
06-07 15:02:50.261 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 3
06-07 15:02:50.351 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER dispose 1
06-07 15:02:50.861 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER subscribe 2
06-07 15:02:51.361 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER dispose 2
我有两个问题:
TESTOBSERVER observed: 1
?答案 0 :(得分:2)
- 为什么它没有打印出TESTOBSERVER观察到:1?
醇>
大概是因为testObservable()
正在android主线程上执行。因此,在取消之前,永远不可能使用AndroidSchedulers.mainThread()
来观察值。
- 为什么在第二次订阅之后它还没有继续发出9,10,11,12,13?
醇>
因为Observables不是有状态的。每个.subscribe()
电话都独立于其他所有电话。
它不发出任何内容的原因是因为Observer
无法重复使用。因此,由于它已经订阅和处理,因此它不会订阅可观察的内容。