출처 : http://blog.danlew.net/2016/06/13/multicasting-in-rxjava/


멀티 캐스팅은 RxJava에서 중복 된 작업을 줄이기위한 핵심 방법입니다.

당신이 이벤트를 멀티 캐스트하면 보내 같은 이벤트를 모두 다운 스트림 사업자 / 가입자. 이 기능은 네트워크 요청과 같이 값 비싼 작업을 수행 할 때 유용합니다. 각 가입자마다 똑같은 네트워크 요청을 반복적으로 실행하고 싶지는 않습니다. 결과를 멀티 캐스팅하기 만하면됩니다.

멀티 캐스트에는 두 가지 방법이 있습니다.

  1. 를 사용 ConnectableObservable을 통해 ( publish()또는replay()1 )
  2. 사용 Subject

ConnectableObservable또는 전에 수행 된 Subject작업은 한 번만 발생합니다. 그런 다음 해당 작업은 모든 다운 스트림에 멀티 캐스트 Subscribers됩니다.

: 당신이 인식해야 여기에 미묘한 지점이 스트림 만의 시점에서 멀티 캐스트 ConnectableObservable또는Subject . 그 결과, 멀티 캐스트 후에 수행하는 작업에 따라 복제된다 Subscriber.

이것이 어떻게 작동하는지 예를 들어 보겠습니다.

Observable<String> observable = Observable.just("Event")  
    .publish()
    .autoConnect(2)
    .map(s -> {
      System.out.println("Expensive operation for " + s);
      return s;
    });

observable.subscribe(s -> System.out.println("Sub1 got: " + s));  
observable.subscribe(s -> System.out.println("Sub2 got: " + s));

// Output:
// Expensive operation for Event
// Sub1 got: Event
// Expensive operation for Event
// Sub2 got: Event

여기서 우리는이 ConnectableObservable, 고가의 map()운영 및 두 Subscribers. 놀라운 결과는 고가 인 것이 map()작업 실행  우리가 것을 방지하려하더라도 publish()!

이 차트는 상황을 더 명확하게 만듭니다.

게시가 작동하지 않는 이유를 보여주는 차트

당신이 실제로 원하는 경우 map()한 번 일이, 당신은 그것을 넣을 필요가 전에publish()전화 :

Observable<String> observable = Observable.just("Event")  
    .map(s -> {
      System.out.println("Expensive operation for " + s);
      return s;
    })
    .publish()
    .autoConnect(2);

observable.subscribe(s -> System.out.println("Sub1 got: " + s));  
observable.subscribe(s -> System.out.println("Sub2 got: " + s));

// Output:
// Expensive operation for Event
// Sub1 received: Event
// Sub2 received: Event

업데이트 된 차트는 다음과 같습니다.

올바른 게시 사용법이있는 차트

여기에 무슨 교훈이 있니? 작업량을 줄이기 위해 멀티 캐스팅에 의존한다면 올바른 시점에서 멀티 캐스팅해야합니다.

좋든 나쁘 든 들어, 많은 사람들이 사용하고 있습니다 Subjects. 하나의 장점은 멀티 캐스트하지만 당신은 그들이 것을 기억해야한다는 것입니다  그들이 방출 지점에서 멀티 캐스트. 당신이 비싼 사업자의 무리가 하류의 적용이 있다면 Subject당신은 다른 추가하는 것을 고려한다 publish()하류 어딘가에.


1 share() 및cache()도 옵션입니다,하지만 그들은 기본적으로 그냥 주위에 바로 가기ConnectableObservableshare()그냥publish().refCount()cache()사용하여 재 작성 할 수 있습니다replay().autoConnect().

'Android > RXAndroid' 카테고리의 다른 글

Easy SQLite on Android with RxJava  (0) 2017.02.21
Rx 예제모음  (0) 2017.02.21
MissingBackpressureException 설명  (0) 2017.02.03
Flowable 를 언제 사용하면 될까?  (0) 2017.02.03
RxJava 예제  (0) 2017.01.31

+ Recent posts