考虑以下示例,它会创建一个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()
检查?
如果是,那么支票是否总是必要的,还是取决于使用可观察物的作曲/订阅者?
包括支票是最佳做法吗?
答案 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)));