티스토리 뷰
Qiita에서 좋은 글을 발견해서 번역하여 공유합니다
출처 링크를 걸어둡니다.
RxJava2에서 바뀐 점
RxJava2.x의 릴리즈가 가까워지고 있기 때문에, What's different in 2.0를 참고하여 1.x버전과 주된 변경점을 설명하려고 합니다. 글을 쓰는 시점에서의 버전은 2.0.0-RC2입니다. 버전 상승으로 인한 변경점이 있다면 추가로 적을지도 모르겠습니다.
패키지명 변경
RxJava 2.x는、ReactiveStream를 따르기 때문에, 인터페이스와 그외 여러부분이 변경되었습니다. (예: Subscription -> Disposable 등)
그렇기 때문에, 별도의 패키지를 통해 제공되고 있습니다.
1.x | 2.x | |
|---|---|---|
| Dependency notation | io.reactivex:rxjava:1.x.y | io.reactivex.rxjava2:rxjava:2.x.y |
| Java base package | rx | io.reactivex |
Null 비허용
onNext(null)는NullPointerException이 발생하도록 되었습니다.
API의 리스폰스 바디가 비어있다는 의미로 null을 반환하고 있던 경우에는 Completable를 써야합니다.
상황에 따라서 Null허용이 가능한 BehaviorSubject를 사용하는 경우에는, 대체수단이 없기때문에 치명적일지도 모르겠습니다.
Observable과 Flowable
1.x까지는 Backpressure는Observable로 구현되어있었습니다만, Backpressure가 없는 것이Observable、있는 것은Flowable로 인터페이스가 변경되었습니다.
Backpressure를 지금까지 의식하지 않았던 경우는 문제가 없을것으로 보입니다만, 사용하고 있던 경우에는 Flowable로 변경할 필요가 있습니다.
Single
onSuccess또는 onError중 어느 한쪽만 한번만 불려집니다. onCompleted는 불려지지 않게 됩니다.
Completable
onComplete또는 onError중 한쪽만 한번 불려지게 됩니다.
Maybe
Single과Completable를 합친것과 같은 클래스입니다. onSuccess와onComplete와onError\중에 어느 한가지가 한번 불려지게 됩니다.
Subject과Processor
Observable와Flowable와 마찬가지로, Backpressure 없는 것이Subject、있는 것이 Processorと가 됩니다.
함수형 인터페이스
RxJava에서 정의되었던 각종 함수형 인터페이스가 대부분 변경됩니다.
기본적으로 람다를 사용하고 있다면 별로 영향이 없을 것입니다.
각종 인터페이스 메소드에 throws Exception가 첨부되어 졌기 때문에, 쓸데없는try-catch도 줄어들게 되겠죠.
1.x | 2.x |
|---|---|
Action0 | Action |
Action1 | Consumer |
Action2 | BiConsumer |
ActionN | Consumer<Object[]> |
Func0 | 삭제 |
Func1 | Function |
Func2 | BiFunction |
Func3-9 | Function3-9 |
FuncN | Function<Object[], R> |
Func1<T, Boolean> | Predicate |
아래와 같이, 함수형 인터페이스의 메소드명도 미묘하게 달라졌습니다.
| Interface name | Method name |
|---|---|
Action | run |
Consumer | accept |
Function | apply |
Predicate | test |
또한 Scheduler쪽의 함수형 인터페이스는, Runnable이 사용되었습니다.
Subscriber
ReactiveStream에 의해, subscribe()쪽의 인터페이스가 변경되었습니다.
subscribe(Observer)와subscribe(Subscriber)를 사용하는 경우에는, 특별히 주의가 필요합니다.
일단, Observable#subscribe(Observer)와Flowable#subscribe(Subscriber)가 분리 되었습니다.
또한, 양쪽 모두 void메소드가 되었습니다.
이것을 dispose(1.x에는unsubscribe)하기 위해서는, Observer와Subscriber자체에 구현하여, 외부로부터dispose해야합니다.
그리고, onCompleted가onComplete로,onStart가onSubscribe로 변경되었습니다.
람다의 subscribe(onNext, onError, onComplete, onSubscribe)를 사용하는 경우에는, 큰 영향은 없을 것으로 보입니다.
Subscription
Subscription가Disposable로 변경되었습니다.
1.x | 2.x |
|---|---|
Subscription | Disposable |
isUnsubscribed() | isDisposed() |
unsubscribe() | dispose() |
CompositeSubscription | CompositeDisposable |
Scheduler
Schedulers.test()가 제거 되기때문에, new TestScheduler()를 사용하도록 해야합니다.
Scheduler를 커스터마이징 할 경우에는, Worker를 사용하지 못하도록 되었습니다. (자주 까먹기 때문일까요?)
커스터마이징 하지 않는 경우에는 그다지 영향은 없습니다.
Operator의 변경점
https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#1x-observable-to-2x-flowable
오버로드 메소드의 통합이나 신규추가 등, 꽤나 많은 변경점이 있습니다.
Operator의 커스터마이징
https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0
1.x과 비교하면 10배 정도 커스터마이징 하는 것이 어렵다고 합니다.
Observable#lift에서 사용되는ObservableOperator의 소스 를 본 결과, Upstream/Downstream의 연결을 전부 적어야 하는 것 같습니다.ObservableOperator를 구현한 유틸리티 클래스도 없어 보입니다.
4줄 요약
- 마이그레이션이 간단하지 않다.
- 람다를 사용하지 않는 경우에는, 일단 람다 치환부터 시작하자
- Operator의 마이그레이션은 더욱 어려워 보인다.
- 개인적으로는 이런 라이브러리 만들었기 때문에, null비허용이 제일 곤란하다...
참고문서
'프로그래밍 > ANDROID' 카테고리의 다른 글
| [번역] 누구나 5분이면 이해하는 DI ( Dependency Injection ) (0) | 2018.06.06 |
|---|---|
| Android Architecture Components (AAC) 를 Realm과 접목시켜보자 (0) | 2017.11.23 |
| [Android/IOS] Firebase Cloud Message (FCM) 유의점 정리 (0) | 2017.02.27 |
| [번역] [Qiita] RecyclerView에 새롭게 적용된 ItemPrefetch 알아보기 (0) | 2016.11.27 |
| [Qiita] 안드로이드 테스트에 도움되는 툴 2가지 소개 (0) | 2015.10.26 |
- Total
- Today
- Yesterday
- 일본여행
- 도쿄맛집
- 편육
- 리액트 네이티브
- 수요미식회
- 을지면옥
- react native
- 평양면옥
- observable
- 브이로그
- 청계천 맛집
- 덴뿌라
- 도쿄
- 리액트
- 필동면옥
- android
- Redux
- 여행
- 일드
- Qiita
- 평양냉면
- mobx
- 맛집
- 중쇄를찍자
- 쿠로키 하루
- 야키니쿠
- 우래옥
- 리액트네이티브
- 을지로3가
- 안드로이드
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |