Observable이 데이터를 발행하는 속도 옵서버가 데이터를 받아서 처리하는 속도 사이의 차이가 발생할 때 사용하는 함수입니다. 계산 중인데 시작 버튼을 눌러서 계산이 다시 시작이 되면 매우 곤란할 것입니다. 이를 방지하기 위해 사용합니다. sample 특정한 시간 동안 가장 최근에 발행된 데이터만 걸러 줍니다. 많은 데이터가 들어와도 마지막 데이터만 발행합니다. 입력 class SampleExample { fun marbleDiagram() { val data = arrayOf("1", "7", "2", "3", "6") CommonUtils.start() // 100ms 간격으로 4개 발행 val earlySource = Observable.fromArray(*data) .take(4) .zipWi..
지금까지 onError 이벤트를 통해 예외 처리를 하였다. 하지만 try-catch 문을 사용하여 예외 처리를 할 수 있습니다. 아래는 try-catch문을 사용한 예외 처리 코드입니다. 입력 class ExceptionHandling { fun cannotCatch() { val source = Observable.create{ emitter: ObservableEmitter -> emitter.onNext("1") emitter.onError(Exception("Some Error")) emitter.onNext("3") emitter.onComplete() } try { source.subscribe { data -> Log.it(data) } } catch (e: Exception) { Log.i..
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..