RX(Reactive Extentions) 란?
- 비동기 데이터 스트림을 처리하는 AP를 제공하는 라이브러리
- 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리
- Input, Operators, Output
RX의 장점
- Functional
Avoid intricate stateful programs, using clean input/output functions over observable streams.
- Less is more
ReactiveX's operators often reduce what was once an elaborate challenge into a few lines of code.
- Async error handling
Traditional try/catch is powerless for errors in asynchronous computations, but ReactiveX is equipped with proper mechanisms for handling errors.
- Concurrency made easy
Observables and Schedulers in ReactiveX allow the programmer to abstract away low-level threading, synchronization, and concurrency issues.
Rx의 역사
계속 복잡해지고 많아지는 이슈들에 대한 처리 방법으로써 마이크로소프트에서 옵저버 패턴과 LINQ 스타일 문법을 확장하고 정립하여 반응형 확장(Reactive Extensions)을 공개 하였다.
이는 여러 기술 기반 회사들의 호응을 었었으며 넷플릭스가 Rx를 자바(RxJava)환경에 옮겼고, 사운드클라우드(SoundCloud)의 마티아스 캐플러(Matthias Kappler)는 RxJava를 안드로이드(RxAndroid)까지 확장 하였다.
코딩으로.. Start
Part1. The Basics
Hello, World!
문자열을 전달하는 Observable 생성
결과를 수신받는 Observer 생성
return 받은 URL 목록을 출력하려면?
위 코드를 좀 더 rx 스럽게 할 수 있다.
위에서 받은 url 목록은 from operator를 사용해서 구현이 가능하다.
하지만 subscribe 안에서 또 Observable을 생성하고 subscribe를 사용한다는게 만족스럽지는 못하다.
이를 해결하기 위해서 flatMap()을 사용할 수 있다.
flatMap()
flat이라는 의미 그대로 내부 요소들을 평평하게 펴서 내보내는 기능을 한다.
만약 아래와 같은 코드가 있을 경우, from은 두개의 스크링을 포함한 배열 두개를 반환한다.
하지만 각각의 배열의 내부 요소들 네개를 순서대로 반환 받고 싶을 때는?
이 때 사용 하는 것이 flatMap 이다.
출력 결과
Hello
world!
goodbye
world
이를 활용하여 위에서 만족스럽지 못하는 코드를 개선할 수 있다.
람다식으로
좀 더 활용해볼까?
웹사이트의 URL에서 제목을 가져오고 싶다면?
URL의 제목을 가져오는 메서드는 아래와 같다
flatMap을 이용해서 아래와 같이 사용이 가능하다.
람다식으로
operator들을 좀 더 써보자.
제목이 없는 경우는 어떤식으로 처리할까?
filter()
오직 boolean 값만 리턴하는 operator
최대 5개까지만 보여주고 싶다면
take()
데이터가 5개 미만이라면 데이터 있는 만큼만 동작한다. (5번 다 돌지 않음)
제목들을 내부에 저장하고 싶다면
doOnNext()
각 항목이 나올(emitted)때마다 추가 동작을 가능하게 해준다.
다음은...?
Error Handling, Schedulers, Retrofit, LifeCycle, ...
그 다음은...?
활용 방안을 위한 샘플 코딩...??
그리고...?
MVP
출처
http://reactivex.io/
http://blog.danlew.net
http://freemmer.tistory.com/126
https://brunch.co.kr/@yudong/34
http://tiii.tistory.com/15
https://realm.io/kr/news/rxandroid/
http://stackoverflow.com/questions/28402689/what-is-the-purpose-of-doonnext-in-rxjava
https://toepic.fail/rxandroid-flatmap-83b613e11602#.4nu86cfef