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 생성



Observable의 subscribe 메서드에 Observer 전달해서 실행.


출력결과

Hello, World!


위와 같은 단일 아이템일 경우 그에 맞는 Observable을 사용할 수 있다.


Observer 대신 함수를 1개 전달하는 것으로 onNext시에 함수를 실행할 수 있다.



onNext(), onError(), onComplete() 를 각각 매개변수로 전달해서 사용이 가능하다.


하지만 여기에서는 첫번째 파라미터만 필요하므로 아래와 같이 구현한다.


출력결과
Hello, World!

메서드는 연결(chaining)해서 사용이 가능하다.


람다식을 사용하면 아래와 같이 가능하다.



아래와 같이 문자열을 수정해서 출력하고 싶다면?


위와같이 한다면 여러개의 데이터일 때에는 모두 수정을 해줘야 되나?


위와같이 하면 코드는 간편해지긴 했지만 변경하는 로직이 메인쓰레드에서 실행을 하게 되므로
좀 더 가볍고 만족스러운 해결책이 필요하다.

그렇다면?


Operators

map()
Observable 을 별도의 Observable 로 변환한다. 이 때 원본의 데이터는 변경하지 않고 새로운 스트림을 만들어 낸다.


람다식으로 변경


input과 output 타입이 다르다면?


람다식으로


map을 더 활용해서 Subscriber 를 더 작게 가보자.


위의 모든 코드는 아래와 같이 사용할 수 있다.




Part2. Operator,Operator

아래는 text로 검색해서 URL 목록을 return 하는 코드이다.


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


Posted by 윤연식
,