什么时候需要检查订阅者是否在调用onNext()和onError()之前订阅?

时间:2015-12-02 07:42:35

标签: reactive-programming rx-java

考虑以下示例,它会创建一个Observable来包装另一个生成Widgets的API

public Observable<Widget> createWidgetObservable() {

        return Observable.create(new Observable.OnSubscribe<Widget>() {

            @Override
            public void call(final Subscriber<? super Widget> subscriber) {
                WidgetCreator widgetCreator = new WidgetCreator();
                widgetCreator.setWidgetCreatorObserver(new WidgetCreator.WidgetCreatorObserver() {
                    @Override
                    public void onWidgetCreated(Widget widget) {
                        if (!subscriber.isUnsubscribed()) {
                            subscriber.onNext(widget);
                        }
                    }

                    @Override
                    public void onWidgetError(Throwable e) {
                        if (!subscriber.isUnsubscribed()) {
                            subscriber.onError(e);
                        }
                    }
                });

            }

        });
    }

在致电subscriber.isUnsubscribed()subscriber.onNext()之前,是否需要进行subscriber.onError()检查?

如果是,那么支票是否总是必要的,还是取决于使用可观察物的作曲/订阅者?

包括支票是最佳做法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用它们缩小发射和取消订阅之间的窗口,但如果您没有循环,则大多数情况下都不需要。更重要的是,如果取消订阅发生,您必须“取消设置”WidgetCreatorObserver,否则它将继续接收和丢弃数据并保持它可能持有的每个引用。

WidgetCreator widgetCreator = new WidgetCreator();
WidgetCreator.WidgetCreatorObserver wo = new WidgetCreator.WidgetCreatorObserver() {
    @Override
    public void onWidgetCreated(Widget widget) {
        if (!subscriber.isUnsubscribed()) {
            subscriber.onNext(widget);
        }
    }

    @Override
    public void onWidgetError(Throwable e) {
         if (!subscriber.isUnsubscribed()) {
             subscriber.onError(e);
         }
    }
}

widgetCreator.setWidgetCreatorObserver(wo);
wo.add(Subscriptions.create(() -> widgetCreator.removeWidgetCreatorObserver(wo)));