# Table of Contents

# RxJava

RxJava (opens new window)은 Java에서 ReactiveX를 구현한 라이브러리입니다. RxJava을 사용하기 위해서는 의존성을 추가해야합니다.

모듈 수준의 build.gradle에 의존성을 추가합니다.

// 모듈 수준의 build.gradle

dependencies {
    // RxJava 3
    implementation "io.reactivex.rxjava3:rxjava:3.x.y"
}

# Observable

Observable은 이벤트를 발생시키는 주체입니다. 이벤트를 발생시키는 과정을 방출(Emit)이라고 하며, Observable은 다음과 같이 생성합니다.

Observable observable = Observable.create((ObservableEmitter<T> emitter) -> {
    // ...
});

제너릭의 타입 파라미터 T에는 이벤트와 함께 전달할 데이터의 자료형을 명시합니다. 예를 들어 문자열 타입의 데이터를 함께 전달하는 경우 다음과 같이 작성합니다.

Observable observable = Observable.create((ObservableEmitter<String> emitter) -> {
    // ...
});

ObservableEmitter클래스에는 이벤트를 방출하기 위한 메소드가 정의되어있습니다. onNext() 메소드를 사용하면 정상적인 이벤트를 방출할 수 있습니다. 또한 onNext() 메소드의 인자로 값을 함께 전달할 수 있습니다.

Observable observable = Observable.create((ObservableEmitter<String> emitter) -> {
    emitter.onNext("Value 1");
});

위 코드는 아래처럼 단축할 수 있습니다.

Observable observable = Observable.create(emitter -> {
    emitter.onNext("Value 1");
});

이벤트를 여러 번 방출할 수도 있습니다.

Observable observable = Observable.create(emitter -> {
    emitter.onNext("Value 1");
    emitter.onNext("Value 2");
    emitter.onNext("Value 3");
});

이벤트 방출을 완료할 때는 onComplete()를 호출합니다.

Observable observable = Observable.create(emitter -> {
    emitter.onNext("Value 1");
    emitter.onNext("Value 2");
    emitter.onNext("Value 3");
    emitter.onComplete();
});

onComplete()를 호출한 후 방출하는 이벤트는 실제로 방출되지 않습니다.

Observable observable = Observable.create(emitter -> {
    emitter.onNext("Value 1");
    emitter.onNext("Value 2");
    emitter.onNext("Value 3");
    emitter.onComplete();
    emitter.onNext("Value 4");  // 방출되지 않음
    emitter.onNext("Value 5");  // 빵출되지 않음
});

비정상적인 이벤트는 onError() 메소드를 사용하여 방출할 수 있습니다.

Observable observable = Observable.create(emitter -> {
    emitter.onError(new Exception("This is error"));
});

# subscribe()

Observable은 생성만 한다고 이벤트를 방출하지 않습니다. 누군가 Observable을 구독(Subscribe)해야만 이벤트를 방출합니다.

subscribe()메소드는 Observable이 방출하는 이벤트를 수신할 때 사용합니다. subscribe()Observer클래스의 인스턴스를 매개변수로 전달받습니다.

Observable observable = Observable.create(emitter -> {
    // ...
});

observable.subscribe(new Observer() {

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        
    }

    @Override
    public void onNext(@NonNull Object o) {

    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

각 메소드의 역할은 다음과 같습니다.

  • onSubscribe(): 구독을 시작할 때 호출
  • onNext(): onNext()이벤트가 방출되면 호출
  • onError(): onError()이벤트가 방출되면 호출
  • onComplete(): onComplete() 이벤트가 방출

하나의 Observable은 여러 곳에서 구독할 수도 있습니다.

Observable observable = Observable.create(emitter -> {
    // ...
});

// 첫 번째 구독
observable.subscribe(new Observer() {

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        
    }

    @Override
    public void onNext(@NonNull Object o) {

    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

// 두 번째 구독
observable.subscribe(new Observer() {

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        
    }

    @Override
    public void onNext(@NonNull Object o) {

    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

이제 예제를 살펴봅시다.

Observable observable = Observable.create(emitter -> {
    emitter.onNext("Value 1");
    emitter.onNext("Value 2");
    emitter.onNext("Value 3");
});

observable.subscribe(new Observer() {

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        System.out.println("onSubscribe");
    }

    @Override
    public void onNext(@NonNull Object value) {
        System.out.println("onNext: " + value);
    }

    @Override
    public void onError(@NonNull Throwable e) {
        System.out.println("onError: " + e.getLocalizedMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
});
}

다음과 같이 출력됩니다.

onSubscribe
onNext: Value 1
onNext: Value 2
onNext: Value 3