RxJava의 코드에는 로그를 넣을 수 있는 공간이 없습니다. Observable로 시작하는 업스트림과 그것을 받아서 처리하는 다운스트림이 동일한 문장으로 이루어져 있기 때문입니다. 따라 가독성이 높지만 예외 코드를 넣는데 어려움이 있습니다. doOnNext, doOnComplete, doOnError Observable에서 어떤 데이터를 발행할 때는 onNext, 중간에 에러가 발생하면 onError, 모든 데이터를 발행하면 onComplete 이벤트가 발생합니다. 입력 class DoOnExample { fun basic() { val orgs = arrayOf("1", "2", "3") val source = Observable.fromArray(*orgs) source.doOnNext{ data ..
Do 세계의 날씨 정보를 제공하는 API 중 OpenWeatherMap이 있습니다. 무료로 제공되는 API이고 REST 방식으로 제공됩니다. RxJava를 사용하여 데이터를 가져올 것입니다. Api Key 받기 API Key 생성을 위해 OpenWeatherMap 홈페이지에 접속한 후 중간 위의 Sign UP을 눌러 회원 가입합니다. 회원 가입을 완료하면 API 메뉴를 누른 후, Cueent weather data에 있는 Subscribe를 누릅니다. Free에 있는 Get Api key and Start를 누른 후 맨 위 중간에 있는 Sign in을 누릅니다. API Keys를 누르면 Default에 API Key 하나가 생긴 것을 볼 수 있습니다. API 준비가 끝났으니 이제 간단한 REST API ..
RxJava 스케줄러의 핵심은 결국 제공되는 스케줄러의 종류를 선택한 후 subscribeOn과 observeOn 함수를 호출하는 것입니다. subscribeOn 함수는 Observable에서 구독자가 subscribe 함수를 호출했을 때 데이터 흐름을 발행하는 스레드를 지정하고, observeOn 함수는 처리된 결과를 구독자에게 전달하는 스레드를 지정합니다. 또한, subscribeOn 함수는 처음 지정한 스레드를 고정시키므로 다시 subsribeOn 함수를 호출해도 무시합니다. 하지만 observeOn 함수는 다릅니다. 위의 사진을 설명하면 아래와 같습니다. subscribeOn을 호출했을 때는 데이터를 발행하는 첫 줄이 파란색 줄에서 실행된다. 이후에는 observeOn 함수가 호출될 때까지 파란색..
RxJava의 스케줄러를 활용하면 비동기 프로그래밍 방식이 달라집니다. 리액티브 프로그래밍은 서버와 연동하는 비동기 프로그래밍을 작성할 대 큰 힘을 발휘합니다. 아래는 HTTP 기반의 네트워크 프로그램 예제입니다. 입력 import common.Log import okhttp3.* import java.io.IOException class HttpGetExample { private val client : OkHttpClient = OkHttpClient() private val URL_README = "https://raw.githubusercontent.com/Im-Tae/Blog_Example/master/RxJava/samples/README_TEST.md" fun run() { val reque..
Rxjava는 다양한 스케줄러를 제공합니다. 특정 스케줄러를 사용하다가 다른 스케줄러로 변경하기 쉽습니다. 마치 map 함수를 한 번 더 호출하는 것처럼 새롭게 스케줄러를 추가하거나 기존의 스케줄러를 다른 것으로 교체할 수 있습니다. 뉴 스레드 스케줄러 이름 그대로 새로운 스케줄러를 생성합니다. Rxjava의 스케줄러는 subscribeOn과 observeOn에 나눠서 적용할 수 있는데, 아래는 subscribeOn만 적용한 코드입니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import io.reactivex.schedulers.Schedulers class NewThreadSchedulerExample..
delay timer, interval, defer처럼 delay도 시간을 다루는 함수입니다. timer, interval, defer가 Observable을 생성하는 역할이라면, delay는 연산자로서 보조 역할을 합니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import java.util.concurrent.TimeUnit class DelayExample { fun marbleDiagram() { val data = arrayOf("1", "7", "2", "3", "4") val source = Observable.fromArray(*data) .delay(100, TimeUnit.MILLISEC..
조건 연산자 Observable의 흐름을 제어하는 역할을 합니다. filter 연산자가 발행된 값을 채택하느냐 기각하느냐 여부에 초점을 맞춘다면, 조건 연산자는 지금까지의 흐름을 어떻게 제어할 것 인지에 초점을 맞춥니다. amb amb는 ambigious (모호한)라는 영어 단어의 줄임 말입니다. 여러 개의 Observable 중에서 1 개의 Observable을 선택하는데, 선택 기준은 가장 먼저 데이터를 발행하는 Observable입니다. 나머지 Observable에서 발행하는 데이터는 모두 무시합니다. 첫 번째 Observable인 원을 발행했으므로 사각형을 발행하는 두 번째 Observable에서 발행되는 값은 모두 무시합니다. 입력 import common.CommonUtils import co..