Schedulars


스케쥴러는 해당 Observable, Operator, Subscriber를 어떤 스레드에서 수행할지 결정하는 것이다.

subscribeOn 과 observeOn 으로 지정한다.



subscribeOn


subscribeOn은 Observable의 스케쥴러를 바꾸는 것으로써 한번만 적용할 수 있다.


observeOn


observeOn 에서 지정한 스케쥴러는 이후에 따라오는 Operator, Subscriber에 적용된다.


(RxJava)


Schedulers.computation() - 이벤트 룹에서 간단한 연산이나 콜백 처리를 위해서 쓰는 것입니다.

RxComputationThreadPool라는 별도의 스레드 풀에서 돌아갑니다. 최대 cpu갯수 개의 스레드 풀이 순환하면서 실행됩니다.

I/O 처리를 여기에서 해서는 안됩니다.

Schedulers.from(executor) - 특정 executor를 스케쥴러로 사용합니다.

Schedulers.immediate() - 현재 스레드에서 즉시 수행합니다.(2.x 버전에서 삭제됨)

observeOn()이 여러번 쓰였을 경우 immediate()를 선언한 바로 윗쪽의 스레드를 따라갑니다.

Schedulers.io() - 동기 I/O를 별도로 처리시켜 비동기 효율을 얻기 위한 스케줄러입니다.

자체적인 스레드 풀 CachedThreadPool을 사용합니다. API 호출 등 네트워크를 사용한 호출 시 사용됩니다.

Schedulers.newThread() - 항상 새로운 스레드를 만드는 스케쥴러입니다.

Schedulers.trampoline() - 큐에 있는 일이 끝나면 이어서 현재 스레드에서 수행하는 스케쥴러.


(RxAndroid)


AndroidSchedulers.mainThread() - 안드로이드의 UI 스레드에서 동작합니다.

HandlerScheduler.from(handler) - 특정 핸들러 handler에 의존하여 동작합니다.


일부 오퍼레이터들은 자체적으로 어떤 스케쥴러를 사용할지 지정합니다. 예를 들어 buffer 오퍼레이터는 Schedulers.computation()에 의존하며 repeat은 Schedulers.trampoline()를 사용한다.


보통 Schedulers.io() 에서 수행한 결과를 AndroidSchedulers.mainThread() 에서 받아 UI에 반영하는 패턴이 많이 사용된다.


기본 동작



출력결과


subscribe:main

map: main

on next: main


subscribeOn, observeOn 간단하게


subscribeOn만



출력결과


subscribe:RxComputationThreadPool-1

map: RxComputationThreadPool-1

on next: RxComputationThreadPool-1


observerOn만



출력결과


subscribe:main

map: RxComputationThreadPool-1

on next: RxComputationThreadPool-1


둘다 한개씩


 

출력결과


subscribe:RxCachedThreadScheduler-1

map: main

on next: main


subscribeOn, observeOn 을 더 많이



출력결과


subscribe:RxCachedThreadScheduler-1

map1: main

map2: RxNewThreadScheduler-1

map3: RxSingleScheduler-1

on next: RxSingleScheduler-1



스케줄러는 단독으로 사용 가능



출력결과


worker: RxNewThreadScheduler-1


람다식으로



API 통신하기 - Retrofit


gradle 설정


compile 'com.squareup.retrofit2:retrofit:2.0.0'

compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

compile 'com.squareup.retrofit2:converter-gson:2.0.0'



RxAndroid를 Retrofit이 다룰 수 있게 하기 위해 RxJava2CallAdapterFactory를 콜 어댑터 팩토리로 추가



API


Retrofit



일반



사용


예: 공백 결과는 생략하고, 모두 대문자로 변환하고, 최초 10건만 처리



clear unsubscribe


콜백처리를 일괄 처리


비동기 콜백처리가 완료되고 결과가 반환될때 화면이 종료되면 Crash 현상 방지, 메모리 릭을 발생하지 않게 하기 위해 clear 메서드를 호출함으로써 콜백을 해제할 수 있다.

(onError, onComplete시에는 자동으로 unsubscribe가 된다.)

CompositeDisposable 클래스를 통해 다수의 Subscription 에 대한 콜백들을 한번에 해제 할 수 있다.





참고자료

http://pluu.github.io/blog/android/rx/2015/04/28/android-rxandroid/

https://realm.io/kr/news/rxandroid-4/

http://tiii.tistory.com/18

http://realignist.me/code/2016/05/29/rxjava-on-android.html
https://realm.io/kr/news/mobilization-hugo-visser-rxjava-for-rest-of-us/

다음은...?

좀 더 다양한 샘플 코드들.... or ...event bus?


Posted by 윤연식
,