티스토리 뷰

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Qiita에서 좋은 글을 발견해서 번역하여 공유합니다

출처 링크를 걸어둡니다.


RxJava2에서 바뀐 점

RxJava2.x의 릴리즈가 가까워지고 있기 때문에, What's different in 2.0를 참고하여 1.x버전과 주된 변경점을 설명하려고 합니다. 글을 쓰는 시점에서의 버전은 2.0.0-RC2입니다.  버전 상승으로 인한 변경점이 있다면 추가로 적을지도 모르겠습니다.

패키지명 변경 

RxJava 2.x는、ReactiveStream를 따르기 때문에, 인터페이스와 그외 여러부분이 변경되었습니다. (예: Subscription -> Disposable 등)

그렇기 때문에, 별도의 패키지를 통해 제공되고 있습니다. 

1.x2.x
Dependency notationio.reactivex:rxjava:1.x.yio.reactivex.rxjava2:rxjava:2.x.y
Java base packagerxio.reactivex

Null 비허용

onNext(null)NullPointerException이 발생하도록 되었습니다.

Observable.just(null);
BehaviorSubject.createDefault<String>(null);
behaviorSubject.onNext(null);

API의 리스폰스 바디가 비어있다는 의미로 null을 반환하고 있던 경우에는 Completable를 써야합니다.
상황에 따라서 Null허용이 가능한 BehaviorSubject를 사용하는 경우에는, 대체수단이 없기때문에 치명적일지도 모르겠습니다.

Observable과 Flowable

1.x까지는 Backpressure는Observable로 구현되어있었습니다만, Backpressure가 없는 것이Observable、있는 것은Flowable로 인터페이스가 변경되었습니다.

Observable.create<Int>(emitter -> emitter.onNext(1));
Flowable.create<Int>(emitter -> emitter.onNext(1), FlowableEmitter.BackpressureMode.LATEST);

Backpressure를 지금까지 의식하지 않았던 경우는 문제가 없을것으로 보입니다만, 사용하고 있던 경우에는 Flowable로 변경할 필요가 있습니다.

Single

onSuccess또는 onError중 어느 한쪽만 한번만 불려집니다. onCompleted는 불려지지 않게 됩니다. 

Completable

onComplete또는 onError중 한쪽만 한번 불려지게 됩니다.

Maybe

SingleCompletable를 합친것과 같은 클래스입니다. onSuccessonCompleteonError\중에 어느 한가지가 한번 불려지게 됩니다.

Subject과Processor

ObservableFlowable와 마찬가지로, Backpressure 없는 것이Subject、있는 것이 Processorと가 됩니다.

함수형 인터페이스

RxJava에서 정의되었던 각종 함수형 인터페이스가 대부분 변경됩니다.
기본적으로 람다를 사용하고 있다면 별로 영향이 없을 것입니다.

각종 인터페이스 메소드에 throws Exception가 첨부되어 졌기 때문에, 쓸데없는try-catch도 줄어들게 되겠죠.

1.x2.x
Action0Action
Action1Consumer
Action2BiConsumer
ActionNConsumer<Object[]>
Func0

삭제

Func1Function
Func2BiFunction
Func3-9Function3-9
FuncNFunction<Object[], R>
Func1<T, Boolean>Predicate

아래와 같이, 함수형 인터페이스의 메소드명도 미묘하게 달라졌습니다.

Interface nameMethod name
Actionrun
Consumeraccept
Functionapply
Predicatetest

또한 Scheduler쪽의 함수형 인터페이스는, Runnable이 사용되었습니다.

Subscriber

ReactiveStream에 의해, subscribe()쪽의 인터페이스가 변경되었습니다.

subscribe(Observer)subscribe(Subscriber)를 사용하는 경우에는, 특별히 주의가 필요합니다. 

일단, Observable#subscribe(Observer)Flowable#subscribe(Subscriber)가 분리 되었습니다. 
또한, 양쪽 모두 void메소드가 되었습니다.
이것을 dispose(1.x에는unsubscribe)하기 위해서는, ObserverSubscriber자체에 구현하여, 외부로부터dispose해야합니다.

그리고, onCompletedonComplete로,onStartonSubscribe로 변경되었습니다. 

람다의 subscribe(onNext, onError, onComplete, onSubscribe)를 사용하는 경우에는, 큰 영향은 없을 것으로 보입니다. 

Subscription

SubscriptionDisposable로 변경되었습니다. 

1.x2.x
SubscriptionDisposable
isUnsubscribed()isDisposed()
unsubscribe()dispose()
CompositeSubscriptionCompositeDisposable

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비허용이 제일 곤란하다...

참고문서


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함