Language/Java

RxJava란? -4 Scheduler

park_juyoung 2019. 1. 26. 20:03

이번에는 스케줄러와 에러 처리에 대해 살펴보겠습니다.

Error Handling

여태까지 우리는 거의 onCompleted()와 onError()를 무시 하고 있었습니다.


이 두개의 메소드는 Observable 가 emit을 끝내거나 받을 수 없는 에러 상황을 맡습니다.


예시를 보고 설명 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
Observable.just("Hello, world!")
    .map(s -> potentialException(s))
    .map(s -> anotherPotentialException(s))
    .subscribe(new Subscriber<String>() {
        @Override
        public void onNext(String s) { System.out.println(s); }
 
        @Override
        public void onCompleted() { System.out.println("Completed!"); }
        
        @Override
        public void onError(Throwable e) { System.out.println("Ouch!"); }
    });
cs



potentialException()  과 anotherPotentialException() 둘다 Exceptions 으로 던져질 가능성이 있습니다.

모든 Observable이 끝나면 onCompleted() 또는 onError() 을 호출합니다.

따라서 출력결과는 String뒤에 "Completed!"가 따라오던지 아님 "Ouch"만 출력되게 됩니다.


이 패턴에서 몇 가지를 알아 낼 수 있습니다.

  • Exception으로 던져지면 onError() 언제든지 불린다.
  • operators는 Exception 을 다룰 필요가 없습니다.
  • Subscriber 가 언제 받는것을 마치는지 알수 있습니다.


Schedulers

멀티 쓰레드 안드로이드 환경에서는 올바른 코드를 올바른 쓰레드에서 실행하기가 어렵습니다.

엉망이 되어 앱이 죽을 수도 있습니다. 고전적인 예외 사항으로는 뷰를 메인쓰레드 외에서 수정할 떄 발생하는 예외가 있습니다.


RxJava에서는 Observable 를 subscribeOn() 을 가지고 어느 쓰레드에서 할것인지와 어느 쓰레드에서 Subscriber 가 실행될것인지를

observeOn() 을 가지고 설정합니다.


1
2
3
4
myObservableServices.retrieveImage(url)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
cs


경험해본사람은 알겠지만 위에 코드가 얼마나 간단한지 아실꺼라 생각됩니다. 

모든 것은 I/O 쓰레드에서 실행되며 VIew 조작은 메인 쓰레드에서 일어나게 됩니다.


이것에 가장 큰 이점은 subscribeOn 과 observeOn은 직접 설정할 수 있다는 점입니다.

이것들 또한 operator로써 이전의 operators에 대해 걱정할 필요가 없습니다.


Subscriptions

Observable.subscribe() 을 호출할떄 이것은 Subscription을 반환합니다.

Subscription은  Observable과 Subscriber사이에 링크를 나타냅니다.


1
2
Subscription subscription = Observable.just("Hello, World!")
    .subscribe(s -> System.out.println(s));
cs


 Subscription을 이용하여 나중에 링크를 끊을 수 있습니다.

1
2
3
subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// Outputs "Unsubscribed=true"
cs


 unsubscribe은 현재 코드 실행 위치에 관계없이 종료됩니다.


'Language > Java' 카테고리의 다른 글

컬랙션 프레임워크란?  (0) 2019.03.20
JVM 구조  (0) 2019.03.07
RxJava - 3 Operators 이어서  (0) 2019.01.26
RxJava란 - 2 Operators  (0) 2019.01.26
RxJava란? - 기본 구조  (5) 2019.01.26