2015-12-02 25 views
2

考慮下面的例子,它創建一個Observable,調用subscriber.onNext()subscriber.onError()之前包裝產生Widgets何時需要在調用onNext()和onError()之前檢查訂閱者是否訂閱了?

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()檢查必要另一個API?

如果是這樣,檢查總是必要的,還是取決於使用observable的組合/訂閱者?

包含支票是否是最佳做法?

回答

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))); 
相關問題