android
9. Android RxJava 공부
코코넛딩
2023. 11. 22. 10:57
이 글은 챗지피티와 구글 번역기를 사용했습니다. 정확하지 않은 내용이 있다면 댓글 남겨주세요.
Observable
Subcribe()
- subscribe()를 통해 옵저버와 Observable을 연결한다.
- 옵저버가 구현해야되는 메서드
- onNext
- Observable은 새로운 항목을 배출할 때마다 이 메서드를 호출한다.
- 배출이라 부름
- onError
- Observable은 기대하는 데이터가 생성되지 않았거나 다른 이유로 오류가 발생할 경우 오류를 알리기 위해 이 메서드를 호출한다.
- 이 메서드가 호출되면 onNext나 onCompeleted는 더이상 호출되지 않는다.
- 알림이라 부름
- onCompleted
- 오류가 발생하지 않았다면 Observable은 마지막 onNext를 호출한 후 이 메서드를 호출한다.
- 알림이라 부름
- onNext()는 0번 이상 호출 가능하며 그 후에는 onCompleted 또는 OnError 둘 중 하나를 마지막으로 호출한다.
- onNext
Subscriber
- Subscriber는 옵저버 인터페이스이다.
- 이 인터페이스는 unsubscribe라는 메서드를 제공한다.
- 옵저버가 Observable의 구독을 더이상 원하지 않는 경우 이 메서드를 호출해서 구독해지 가능
Hot, Cold Observable
- Hot Observable
- Observable이 생성되자 마자 항목을 배출한다.
- 그래서 어떤 경우에는 항목들이 배출되는 중간 부터 Observable을 구독할 수 있다.
- Cold Observable
- 옵저버가 구독할 때까지 항목을 배출하지 않기 때문에 Observable이 배출하는 항목 전체를 구독할 수 있도록 보장 받는다.
- Connectable Observable
- 이 Observable은 옵저버의 구독 여부와는 상관 없이 자신의 Connect메서드가 호출되기 전까지 항목들을 배출하지 않는다.
Observable 연산자
- Observable 생성
- create
- 직접적인 코드 구현을 통해(onNext, onError, onCompleted 함수를 사용하여 구현) Observable을 생성한다.
- defer
- 옵저버가 구독하기 전까지는 Observable 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 Observable을 생성한다.
- 밑의 코드를 보면 첫번째 subsribe된 내용이 두번째 subscribe에 포함되지 않고 새로운 Observable을 생성했다.
- defer은 구독 시점에 따라 다른 데이터나 상태를 반영할 수 있게 해주며, 각 구독이 독립적인 데이터 스트림을 가질 수 있게 한다.
- 데이터 스트림 : 데이터가 연속적으로 흐르는 시퀸스, 데이터가 시간에 따라 연속적으로 생성되고 처리되는 방식
- 구독자가 구독하는 시점에 해당하는 값을 받을 수 있다.
- create
import io.reactivex.rxjava3.core.Flowable;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) throws InterruptedException {
Flowable<LocalTime> flowable = Flowable.defer(() -> Flowable.just(LocalTime.now()));
flowable.subscribe(System.out::print);
System.out.println(" : 1번째 구독 완료");
Thread.sleep(1500L);
flowable.subscribe(System.out::print);
System.out.println(" : 2번째 구독 완료");
}
}
//프린트 결과
//23:03:15.225:첫번째 구독완료
//23:03:46:779:두번째 구독완료
///defer
- Observable 생성
- empty
- 항목은 배출하지 않지만 정상적으로 종료되는 Observable을 생성
- never
- 항목을 방출하지 않고 종료되지 않는 Observable을 생성한다.
- 사용 사례
- 테스팅 및 디버깅
- Observable의 동작을 테스트 하거나 특정조건에서의 타임아웃 처리, 구독 관리등을 테스트할 때 사용가능
- 무한 대기상태를 생성함으로써, 다른 부분의 코드가 올바르게 작동하는지 확인가능
- 특정상황에서 데이터 스트림이 발생하지 않아야하는 경우에 사용
- 리소스 유지
- never가 구독되는 동안 특정 리소스를 계속 활성 상태로 유지하고자 할 때 사용가능
- 테스팅 및 디버깅
- throw
- 항목을 내보내지 않고 오류로 종료되는 Observable을 만든다
- From
- 다른 객체나 자료구조를 Observable로 변환한다.
- Interval
- 특정 시간별로 연속된 정수형을 배출하는 Observable을 생성
- Just
- 객체 하나 또는 객체 집합을 Observable로 변환한다.
- 변환된 Observable은 원본 객체들을 발행한다.
- From과 비슷하지만 From은 방출할 항복을 꺼내기 위해 배열이나 반복가능한 항목 또는 유사한 항목으로 실행하는 반면 Just는 단순히 배열이나 반복가능한 항목 또는 가지고 있는 것을 변경하지 않고 그대로 단일항목으로 방출한다.
- 주의할 점은 null을 전달하면 null을 방출하는 Observable이 된다.
- Range
- 연속된 범위의 정수를 방행하는 Observable을 생성한다.
- Repeat
- 특정항목이나 연속된 항목들을 반복적으로 배출하는 Observable을 생성한다.
- Start
- 함수의 실행결과를 배출하는 Observable을 생성한다.
- Timer
- 지정된 시간이 지나고 난 후 항목을 하나 배출하는 Observable을 생성한다.
- empty
Observable 변환
- Buffer
- Observable로 부터 정기적으로 항목들을 수집하고 묶음으로 만든후에 묶음 안에 있는 항목들을 한번에 하나씩 배출하지 않고 수집된 묶음 단위로 배출한다.
- FlatMap
- 하나의 Observable이 발행하는 항목들은 여러개의 Observable로 변환하고 항목들의 배출을 차례로 줄 세워 하나의 Observable로 전달한다.
- GroupBy
- 원본 Observable이 배출하는 항목들을 key별로 묶은 후 Observable에 담는다.
- 이렇게 key별로 만들어진 Observable들은 자기가 담고 있는 묶음의 항목들을 배출한다.
- Map
- Observable이 배출한 항목에 함수를 적용한다.
- Scan
- Observable이 배출한 항목에 연속적으로 함수를 적용하고 실행한 후 성공적으로 실행된 함수의 리턴값을 발행한다.
- Window
- 정기적으로 Observable의 항목들을 더 작은 단위의 Observable 윈도우로 나눈 후에 한번에 하나씩 항목들을 발행하는 대신 작게 나눠진 윈도우 단위로 항목들을 배출한다.