이번에는 스케줄러와 에러 처리에 대해 살펴보겠습니다.
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 |