Observable 팩토리 함수들 복습하다
몇가지 관점에서 혼란이 와서 재정리!
Observable stream생성 시점
- Observable stream은 Observable 생성과 같이 생성되는 것인지, 나중에 Observer가 subscribe한 시점에 생성되는 것인지 구분
알아보고자 하는 이유
- 자주 변경되는 데이터를 아이템으로 전달 시 주의하기 위해 알아보는 것이 필요
- Observable 아이템을 얻어오는 로직이 오래 걸리거나 무거운 경우 메인 쓰레드가 지연되는 것 주의 필요
Test 방법
- 예제 : Observable 생성 전 "Android10"값을 가진 변수 생성 후, onNext()에서 이 변수를 전달하고,
subscribe 전에 "Android11"값으로 수정함
확인 결과
- Observable 생성 시 정해진 데이터 값을 받는 경우 모두 Observable이 생성될 때 stream을 만드는 것으로 보임
Observable 생성 팩토리 | Observable stream 생성 시점 | 테스트 코드 링크 |
Observable.create() | subscribe될 때 | [Link] |
Observable.just() | Observable 생성될 때 | [Link] |
Observable.fromIterable() | Observable 생성될 때 (단, Iterable 내 아이템 변경은 subscribe 시점에 반영됨) |
[Link] |
Observable.range() | Observable 생성될 때 | [Link] |
Observable.interval() | Observable 생성될 때 | |
Observable.error() | Observable 생성될 때 (단, onError() 전달 파라미터값의 변경은 subscribe 시점에 반영됨) |
[Link] |
Observable.defer() | subscribe될 때 | [Link] |
Observable.fromCallable() | subscribe될 때 | [Link] |
- "subscribe될 때" 생성되는 팩토리 함수들은 Observable.subscribeOn(Schedulers.io()) 함수로 메인쓰레드 지연됨을 방지할 수 있다.
(Observable 아이템을 얻어오는 로직이 오래 걸리거나 무거운 경우)
Example1) Observable.create() : subscribe될 때 stream생성되므로, 메인쓰레드 지연되지 않음
Example1 Result)
Start Time = 15:20:05 [MainThread] subscribe() called Time = 15:20:05 [MainThread] End Time = 15:20:05 heavyWork() called Time = 15:20:05 [Observer] onNext() : Android11, called Time = 15:20:08 |
Example2) Observable.just() : Observable 생성될 때 stream생성되므로, 메인쓰레드 지연됨
Example2 Result)
[MainThread] Start Time = 15:22:32 heavyWork() called Time = 15:22:32 [MainThread] subscribe() called Time = 15:22:35 [MainThread] End Time = 15:22:35 [Observer] onNext(Android11), Time = 15:22:35 [Observer] onComplete() |
END!
스터디 도움 참조 블로그 (References)
- [도서] RxJava 시작하기, 원제 Learning Rxjava, 저자 토마스 닐드| 역자 조승진 |에이콘출판 |2019.07.24 http://book.naver.com/bookdb/book_detail.nhn?bid=12801360
|