2014-11-02 6 views
16

Observable에 대한 일부 청취자 패턴 기반 API를 래핑하려고합니다. 내 코드는 대략 다음과 같습니다. 관찰자() subscription.unscribe를 호출 할 때RxJava의 사용자 정의 Observable에서 관찰자의 구독 취소 작업에 대한 알림을받는 방법

def myObservable = Observable.create({ aSubscriber -> 
    val listener = {event -> 
     aSubscriber.onNext(event);     
    } 
    existingEventSource.addListener(listener) 
}) 

그러나, 나는 나의 관찰 즉시 기본 existingEventSource에서 리스너를 제거합니다. 어떻게하면이 목표를 달성 할 수 있을까요?

답변

29

Subscriber 추상 클래스는 실제로 add 메서드가있어서 Subscription을 구독자와 함께 구독 취소 할 수 있습니다. 당신의 Observable에 가입 된 ObserveraSubscriber

def myObservable = Observable.create({ aSubscriber -> 
    val listener = {event -> 
     aSubscriber.onNext(event);     
    } 
    existingEventSource.addListener(listener) 

    // Adds a lambda to be executed when the Subscriber un-subscribes from your Observable 
    aSubscriber.add(Subscriptions.create(() -> existingEventSource.removeListener(listener))); 
}) 

생각해; 우리는 그것을 Subscriber이라고 부를 것입니다. Subscriber이 여전히 Observable에 가입되어있는 한 Observable은 값을 방출 할 수 있습니다. 하지만 Subscriber 구독을 취소하면 중지되어야합니다. 그러나 우리가 Subscriber 구독을 취소 한 경우 알림을 받고 싶다면 Action을 등록하여 등록 할 수 있습니다. 이것이 add 방법이 사용 된 것입니다. @ dwursteisen이 언급 한 바와 같이, 구독자가 구독을 취소 할 때 기본적으로 실행되는 람다를 등록하는 것입니다.

다른 구독자에서 구독을 구독 취소 할 수도 있습니다. 이를 달성하는 방법에 대한 예제는 rxanroid 프로젝트의 MainThreadSubscription을 참조하십시오.

가 여기에 메인 쓰레드

aSubscriber.add(new MainThreadSubscription() { 
    @Override 
    protected void onUnsubscribe() { 
     existingEventSource.removeListener(listener); 
    } 
}); 
+0

미겔에 구독 취소를 위해 그것을 사용하는 거라고하는 방법의 예, 덕분에 당신의 대답을,하지만 난 그것을 얻을 수 없습니다. 좀 더 자세히 설명해 주시겠습니까? 아니면 내가 읽을 수있는 관련 문서 나 소스 코드를 가르쳐 주시겠습니까? – xwk

+0

add 메서드를 사용하면 Observable이 구독을 취소 할 때 실행되는 람다를 등록합니다. – dwursteisen

+0

@xwk, 나는 당신에게 더 나은 아이디어를 줄 수있는 약간의 설명을 추가했다. –