리액티브 프로그래밍은 데이터 흐름(data flow)과 변화 전파에 중점을 둔 프로그래밍 패러다임
프로그래밍 언어로 정적 또는 동적인 데이터 흐름을 쉽게 표현
데이터 흐름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미
Observable
Observer
Observable이 방출한 데이터를 받아서 데이터 흐름의 변화를 관찰
Observable이 방출한 데이터를 메인 스레드나 UI에 전달하는 역할
onComplete()
Observable이 더 이상 방출할 데이터가 없을 때 호출
onError(Throwable e)
Error 발생 시 호출
onNext(Object o)
새로운 데이터가 방출될 때 호출
방출된 데이터는 매개변수에서 찾을 수 있음
Schedulers
Rx의 핵심은 비동기 처리에 있음
Observable과 Observer가 어떤 스레드에서 작업을 수행할지 지정
subscribeOn(Thread)
Observable이 실행되어야 하는 스레드 지정
observeOn(Thread)
Observer가 실행되어야 하는 스레드 지정
Activity Life Cycle
재개 (create, start, resume)
일시정지 (pause)
멈춤 (stop, destroy)
onCreate (액티비티 생성 직전)
onRestart (액티비티가 stop상태에서 재시작될 경우)
onStart (액티비티가 화면에 보여지기 직전)
onResumed (액티비티가 사용자와 상호작용하기 직전)
onPause (액티비티가 부분적으로 가려짐)
onStopped (액티비티가 더 이상 보이지 않을때)
onDestroy (액티비티가 소멸되기 직전)
Thread
스레드 통신 메커니즘
핸들러 - 루퍼 - 메시지 큐 - 메시지android.os.Looper - UI 스레드에 하나가 존재하며 소비자 스레드와 연관된 메시지 발송자 (데이터를 읽는 역활)
android.os.Handler - 큐에 메시지를 삽입하는 생산자 스레드를 위한 인터페이스와 소비자 스레드 메시지 처리, 하나의 Looper 객체는 많은 핸들러를 갖지만 모두 같은 큐에 삽입
android.os.MessageQueue - 소비자 스레드에서 처리할 메시지들이 담긴 무제한의 연결 리스트. 모든 루퍼와 스레드는 최대 하나의 메시지 큐를 가진다.
android.os.Message : 소비자 스레드에서 실행하는 메시지
Handler
Looper
단점
대안으로 java.util.concurrent API / Kotlin coroutine / RxJAVA 사용 권장