Subscribe, Observe, Scheduler

silmxmail·2021년 8월 12일
0

AndroidStudio

목록 보기
4/26
post-thumbnail

Rx의 역사

Rx는 MS에서 먼저 나왔고, 넷플릭스에서 이를 Java로 컨버팅 하였다.
지금은 여러 언어에서 사용이 가능하다.
비동기 데이터 스트림을 처리하는 API를 제공하는 라이브러리다.
쉽게 말해 비동기 행위를 간단하게 처리하기 위해 만들어진 라이브러리 인 것이다.

https://huns.me/development/2051?utm_content=bufferb8706&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer&fbclid=IwAR0CYgpMpa9qa8vKiX32uAk4gMnV_uwnJLS_Ui_RC_PFt4AMPOVCZH2QYO4

너무 긴 내용은 위의 포스트 글을 참조하자.


그렇다면 Rx는 어디에서 쓸수 있을까?

  1. 비동기 통신을 순차적으로 보내고 싶다.(A가 끝나고 B가 시작됐으면... → 콜백)
  2. 콜백을 받았는데 화면이 사라져서 NPE가 발생한다.
  3. 두개의 비동기 처리가 완료되서 결과값을 하나로 끝내고 싶다.
  4. 버튼을 연속으로 누르면 이벤트가 중복 실행이 된다.
  5. 서버로부터 정보를 받아서 화면에 띄워주고 싶다.

Rx는 어떻게 작동하나요?

먼저 스케쥴러를 통해 어떤 쓰레드에서 실행이 될 지 결정할 수 있다.
스케쥴러는 subscribeOn,observeOn 에서 각각 지정을 할 수 있다.

먼저 Observable이라는 단어를 알아야 한다.
Observable은 단어 그대로 관찰이 가능한 객체를 의미한다.
환경의 변화에 따라서 이벤트를 발생시키기 때문에 관찰가능한 객체가 존재하고, 그것을 쓰레드를 지정해서 구독을 하고 있는다. 그러다가 관찰가능한 객체가 어떤 변화를 일으키면 지정한 이벤트가 발생하는 원리이기 때문이다.

이곳에서 스케줄러라는 녀석이 나오게 되는데 이놈은 Observable,구독자가 어느 스레드에서 실행될지 결정할 수 있다.

Observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({it->
val list =listOf<DocFriendsResponse>(it)
    var listconsult = it.consultList
    var listexpert = it.expertList
    var listcompany = it.companyList
    binding.recyclerview.adapter= QnaAdatper(this,list,listconsult,listexpert,listcompany)
    listconsult.forEach{
        it.type = DocFriendsResponse.IMAGE_TYPE
}
listexpert.forEach{
        it.type = DocFriendsResponse.IMAGE_TYPE2
}

위의 코드를 보자.

Observable가능한 객체가 존재하고 그것을 구독 시작한다.
subscribeOn()은 observable의 작업을 시작하는 쓰레드를 선택한다.
observeOn()은 이후에 나오는 오퍼레이터, subscribe의 스케쥴러를 변경 할 수 있다.
Schedulers는 어떤 쓰레드에서 실행 될지 결정한다.

RxJava와 RxAndroid에서 제공하는 스케쥴러는 다음과 같다.

Schedulers.computation() - 이벤트 룹에서 간단한 연산이나 콜백 처리를 위해 사용됩니다.
RxComputationThreadPool라는 별도의 스레드 풀에서 돌아갑니다. 최대 cㅔu갯수 개의 스레드 풀이 순환하면서 실행됩니다.

Schedulers.immediate() - 현재 스레드에서 즉시 수행합니다.
observeOn()이 여러번 쓰였을 경우 immediate()를 선언한 바로 윗쪽의 스레드를 따라갑니다.

Schedulers.from(executor) - 특정 executor를 스케쥴러로 사용합니다.

Schedulers.io() - 동기 I/O를 별도로 처리시켜 비동기 효율을 얻기 위한 스케줄러입니다.
자체적인 스레드 풀 CachedThreadPool을 사용합니다. API 호출 등 네트워크를 사용한 호출 시 사용됩니다.

Schedulers.newThread() - 새로운 스레드를 만드는 스케쥴러입니다.

Schedulers.trampoline() - 큐에 있는 일이 끝나면 이어서 현재 스레드에서 수행하는 스케쥴러.

AndroidSchedulers.mainThread() - 안드로이드의 UI 스레드에서 동작합니다.

HandlerScheduler.from(handler) - 특정 핸들러 handler에 의존하여 동작합니다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글