2017-10-04 8 views
1

DisposableSingleObserver/DisposableObserver의 단일 인스턴스 만 생성하고 아래의 스트림에서 subscribeWith() 메서드를 통해이를 통과시킴으로써 Observer를 단일 관찰 가능한 스트림에 재사용하려고합니다.처형 된 관찰자를 사용하여 소스를 다시 구독하지 않습니다.

io.reactivex.exceptions.ProtocolViolationException : : : 나는 메시지와 함께 하나의 관찰자 인스턴스를 여러 번 가입하려고 할 때

public class SomeClass { 
    private DisposableSingleObserver<Object> observer; 

    public SomeClass() { 
     observer = new DisposableSingleObserver<Object>() { 
      @Override 
      public void onSuccess(Object object) { 
       ... 
      } 

      @Override 
      public void onError(Throwable throwable) { 
       ... 
      } 
     }; 
    } 

    public void doSomeStuff() { 
     singleStream.subscribeOn(...) 
      .observeOn(...) 
      .subscribeWith(observer); 
    } 
} 

위의 코드는 ProtocolViolationException 결과 승 가입 할 수 없습니다 i (n) com.package.name.SomeClass $ 1 여러 번. com.package.name.SomeClass $ 1의 새로운 인스턴스를 생성하고 대상 소스에 대신 등록하십시오.

그래서 나는 조금 아래와 같이 코드를 수정 :

public class SomeClass { 
    ... 

    public void doSomeStuff() { 
     if (observer != null) { 
      observer.dispose(); 
     } 

     singleStream.subscribeOn(...) 
      .observerOn(...) 
      .subscribeWith(observer); 
    } 
} 

내가의 ProtocolViolationException이 더 이상 발생 된 위의 코드를 실행하고 나는 성공적으로 단일 스트림에서 이벤트를 얻을 수있었습니다합니다. 그러나 doSomeStuff() 방법으로 전화를 걸려고하면 첫 번째 호출에서는 성공적으로 완료되었지만 두 번째 호출에서는 어떤 이벤트도 내 보내지 않았습니다. 구독이 모두 doOnSubscribe()을 통해 발생했음을 확인할 수 있었지만 단일 스트림에 대한 코드 방출 이벤트는 두 번째 호출에서 결코 실행되지 않았습니다. 그래서 세 가지 질문이 있습니다.

  1. 왜 처음에 ProtocolViolationException이 던 졌나요?
  2. 두 경우 모두 소스를 구독 했는데도 첫 번째 구독에서는 이벤트를 가져올 수 있지만 두 번째 구독에서는 이벤트를 가져올 수없는 이유는 무엇입니까?
  3. 단일 인스턴스 만 사용하여 관찰자를 재사용하려면 어떻게해야합니까?

답변

1

1) DisposableSingleObserver과 그 사촌은 상태 기반이며 한 번만 사용하기 때문에 재사용 할 수 없습니다. 이것은 Single에 의해 위임 된 프로토콜 때문입니다. 정확히 하나의 onSubscribe 다음에 많아야 하나의 onSuccess 또는 onError이옵니다. 두 번째 구독이이 프로토콜을 위반합니다.

2) DisposableSingleObserver을 삭제하면 삭제 된 상태가되고 이후의 가입 시도는 즉시 처리 된 것으로 간주됩니다.

3) 안됩니다. 왜 여러 번 구독하고 싶고 매번 새로운 DisposableSingleObserver을 사용할 수없는 이유는 무엇입니까? 데이터 흐름을 재고해야합니다.

+0

1 및 2도 'DisposableObserver'에 해당됩니까? 약 3, Observers에 대한 인스턴스의 수를 제한하려고합니다. – Harry

+0

나는 그 사람들을 "그 사촌"이라고 불렀다. – akarnokd