发布主题doOn订阅不叫
问题描述:
我有一个PublishSubject注册doOnSubscribe
和doOnUnsubscribe
行动。如果订阅完成,这两个操作都不会被调用。发布主题doOn订阅不叫
private PublishSubject<Long> publishSubject;
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
publishSubject = PublishSubject.create();
publishSubject.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d("SUBJECT", "Someone subscribed.");
}
});
publishSubject.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.d("SUBJECT", "Someone UNsubscribed.");
}
});
Observable.interval(1, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
@Override
public void call(final Long tick) {
publishSubject.onNext(tick);
}
});
}
@Override
protected void onResume() {
super.onResume();
subscription = publishSubject.subscribe(new Action1<Long>() {
@Override
public void call(final Long aLong) {
Log.d("SUBJECT", "Got tick " + aLong);
}
});
}
@Override
protected void onPause() {
super.onPause();
subscription.unsubscribe();
}
但在我logcat中,我只得到"Got tick "
消息并没有"Someone subscribed"
。
07-25 17:57:34.110 8753-8965/com.example.plinzen.myapplication I/OpenGLRenderer: Initialized EGL, version 1.4
07-25 17:57:34.954 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 0
07-25 17:57:35.950 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 1
07-25 17:57:36.950 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 2
07-25 17:57:37.950 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 3
07-25 17:57:38.949 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 4
07-25 17:57:39.950 8753-8964/com.example.plinzen.myapplication D/SUBJECT: Got tick 5
任何想法,为什么这些动作不叫,订阅时是onResume()
和取消是onPause()
?我误解了主题话题吗?
答
不要打破链:
private Observable<Long> publishedObservable;
[...]
PublishSubject<Long> publishSubject = PublishSubject.create();
publishedObservable = publishSubject.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d("SUBJECT", "Someone subscribed.");
}
}).doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.d("SUBJECT", "Someone UNsubscribed.");
}
});
而在其他方法使用publishedObservable
。
在代码中,您可以创建两个新的Observables,但是直接丢弃它们; .doFooBar
方法不会修改Observable,它们会创建一个实现所需行为的新方法。
+0
Oooh,我的愚蠢错误!感谢您的帮助 – Christopher
解释*如果订阅完成,这两个操作都不会被调用* –