자신만의 커스텀 함수를 만들어서 사용시 공유되는 이슈가 발생된다.
예를 들어 보자.
인덱스를 넣고 값을 저장하는 IndexedValue
데이터 클래스를 먼저 만든다.
static final class IndexedValue<T> {
final int index;
final T value;
IndexedValue(int index , T value){
this.index = index;
this.value = value;
}
@Override
public String toString() {
return index + " - " + value;
}
}
그리고 compose
에 들어갈 커스텀 함수를 추가한다.
원하는 결과값은 index - value
을 나오는게 목표이다.
static <T>ObservableTransformer<T,IndexedValue<T>> withIndex(){
final AtomicInteger indexer = new AtomicInteger(-1);
return upstream -> upstream.map(v -> new IndexedValue<T>(indexer.incrementAndGet() , v));
}
아래는 테스트 함수이다.
Observable<IndexedValue<String>> indexedValueObservable =
Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
.compose(withIndex());
indexedValueObservable
.doOnNext(v -> System.out.println("Subscriber 1 : " + v))
.test();
indexedValueObservable
.doOnNext(v -> System.out.println("Subscriber 2 : " + v))
.test();
============================================================================
Subscriber 1 : 0 - Alpha
Subscriber 1 : 1 - Beta
Subscriber 1 : 2 - Gamma
Subscriber 1 : 3 - Delta
Subscriber 1 : 4 - Epsilon
Subscriber 2 : 5 - Alpha
Subscriber 2 : 6 - Beta
Subscriber 2 : 7 - Gamma
Subscriber 2 : 8 - Delta
Subscriber 2 : 9 - Epsilon
위 결과에서 보듯이 값이 서로 공유되서 나오는 문제를 볼수 있다.
이유는 싱글 인스턴스인 AtomicInteger
이기 때문이다.
이러한 문제를 해결하기 위해 defer
또는 fromCallable
을 추천한다.
static <T>ObservableTransformer<T,IndexedValue<T>> withIndex(){
return upstream -> Observable.defer(() -> {
final AtomicInteger indexer = new AtomicInteger(-1);
return upstream.map(v -> new IndexedValue<T>(indexer.incrementAndGet() , v));
});
}
이제 결과들이 공유되지 않는 걸 볼수 있다.
Subscriber 1 : 0 - Alpha
Subscriber 1 : 1 - Beta
Subscriber 1 : 2 - Gamma
Subscriber 1 : 3 - Delta
Subscriber 1 : 4 - Epsilon
Subscriber 2 : 0 - Alpha
Subscriber 2 : 1 - Beta
Subscriber 2 : 2 - Gamma
Subscriber 2 : 3 - Delta
Subscriber 2 : 4 - Epsilon
결론은 싱글 인스턴스 데이터를 사용시 공유되는 문제를 해결하기 위해 defer
또는 fromCallabe
을 사용해서 오류를 피하자.
'스터디 > RxJava2' 카테고리의 다른 글
[RxJava2]Test시 Blocking Subscriber 방법 (0) | 2017.10.22 |
---|---|
[RxJava2]연산자를 오버로딩해서 구현해보자. (0) | 2017.10.22 |
[RxJava2] Compose with Parameters (0) | 2017.10.22 |
[RxJava2]Compose 활용 (0) | 2017.10.22 |
[RxJava2]Transformer 활용 (0) | 2017.10.22 |