티스토리 뷰
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
- 을지로3가
- 을지면옥
- 도쿄맛집
- 평양냉면
- 필동면옥
- 편육
- 브이로그
- 리액트 네이티브
- 수요미식회
- 일드
- 안드로이드
- 도쿄
- react native
- 리액트
- mobx
- 맛집
- 청계천 맛집
- Redux
- 중쇄를찍자
- 일본여행
- observable
- android
- 야키니쿠
- 리액트네이티브
- 평양면옥
- 쿠로키 하루
- 여행
- 덴뿌라
- Qiita
- 우래옥
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |