ReactiveX는 Microsoft사 주도 아래 옵서버 패턴, 이터레이터 패턴, 함수형 프로그래밍의 장점과 개념을 접목한 반응형 프로그래밍 기법이다.
이벤트 처리 및 비동기 처리의 구성에 최적화된 라이브러리입니다. Observable 추상화 및 관련 상위 함수에 중점을 둔 단일 JAR로 가벼운 라이브러리며, Java 이외에도 C++, Kotlin, Swift, JavaScript 등 여러 언어를 지원합니다.
주변 환경과 끊임없이 상호 작용을 하는 프로그래밍입니다.
즉, 프로그램이 주도하는 것이 아닌 환경이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법을 말합니다.
개발자는 동시성 문제, 다중 이벤트 처리, 백그라운드 스레드 처리 등을 다루면 많은 문제점에 직면하는데, Rx는 이에 대해 범용적이고 확실한 해결책을 제시합니다.
RxJava에서는 Observable을 구독하는 Observer가 존재하고, Observable이 순차적으로 발행하는 데이터에 대해서 반응합니다.
: Observable.create()를 사용하면 Emitter를 이용하여 직접 아이템을 발행하고, 아이템 발행의 완료 및 오류의 알림을 직접 설정할 수 있다.
Observable<String> source = Observable.create(emitter -> {
emitter.onNext("Hello");
// 발행이 완료되면 반드시 onComplete()를 호출해야 한다.
// onComplete()를 호출 후에는 아이템이 추가로 발행되더라도 구독자는 데이터를 통지받지 못한다.
emiiter.onComplete();
emitter.onNExt("World");
});
//Consumer를 통해 구독하기
source.subscribe(System.out::println);
//결과
Hello
** 만약 오류가 발행했을 시에는 Emitter를 통해 onError(Throwable)를 호출해야하며, 구독자는 이를 적절히 처리해야만 합니다.
Observable<String> source = Observable.create(emitter -> {
emitter.onNext("Hello");
emitter.onError(new Throwable());
emitter.onNext("World");
});
source.subscribe(System.out::println,
throwable -> System.out.println("Error!!")
);
//결과
Hello
Error!!
Observable<String> source = Observable.just("Hello","World");
source.subscribe(System.out::println);
//결과
Hello
World
String[] itemArray = new String[]{"A","B","C"};
Observable source = Observable.fromArray(itemArray);
source.subscribe(System.out::println);
//결과
A
B
C
ArrayList itemList = new ArrayList();
itemList.add("A");
itemList.add("B");
itemList.add("C");
Observable source = Observable.fromIterable(itemList);
source.subscribe(System.out::println);
//결과
A
B
C
//Executor Service를 통해 비동기적인 작업이 이루어질 때 사용됩니다.
Future<String> future = Executors.newSingleThreadExecutor().submit(() -> {
Thread.sleep(5000);
return "Hello World";
});
Observable source = Observable.fromFuture(future);
source.subscribe(System.out::println);
Publisher<String> publisher = subscriber -> {
subscriber.onNext("A");
subscriber.onNext("B");
subscriber.onNext("C");
subscriber.onComplete();
};
Observable<String> source = Observable.fromPublisher(publisher);
source.subcribe(System.out::println);
//결과
A
B
C
Callable<String> callable = () -> "Hello World";
Observable source = Observable.fromCallable(callable);
source.subscribe(System.out::println);
//결과
Hello World
출처: 아키텍처를 알아야 앱 개발이 보인다.