# 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