【问题标题】:PublishSubject doOnSubscribe not calledPublishSubject doOnSubscribe 未调用
【发布时间】:2016-07-26 02:52:24
【问题描述】:

我有一个注册了 doOnSubscribedoOnUnsubscribe 操作的 PublishSubject。如果完成订阅,则不会调用这两个操作。

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() 时,为什么不调用这些操作?我误解了主题主题吗?

【问题讨论】:

  • 解释 如果订阅完成,则不会调用这两个操作

标签: android rx-java rx-android


【解决方案1】:

不要破坏链条:

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

看,在你的代码中你创建了两个新的 Observable,但是你直接把它们扔掉了; .doFooBar 方法不会修改 Observable,它们会创建一个实现所需行为的新方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多