RxJava. Single 클래스

박채빈·2022년 1월 8일

RxJava

목록 보기
3/3
post-thumbnail

Single 클래스

Observable 클래스는 데이터를 무한하게 발행할 수 있지만, Single 클래스는 오직 1개의 데이터만 발행하도록 한정한다.
결과가 유일한 서버 API를 호출할 때 유용하다.

  • Single 클래스의 마블 다이어그램

    이미지 출처 : https://reactivex.io/documentation/ko/single.html#

    • 데이터가 발행과 동시에 종료된다.
      onNext()와 onComplete() 함수가 onSuccess() 함수로 통합된 것이다.
      따라서 Single 클래스의 라이프사이클 함수는 onSuccess(T value)와 onError() 함수로 구성된다.

just() 함수

just() 함수 활용 예

Single<String> source = Single.just("Hello Single");
source.subscribe(System.out::println).dispose();

Observable과 거의 같은 방법으로 사용가능.
가장 간단한 방법은 Observable처럼 just()를 호출하는 것이다.

Observable에서 Single 클래스 사용

Single은 Observable의 특수 형태이므로 Observable에서 변환 가능하다.

// 1. Observable에서 Single 객체로의 변환
Observable<String> source = Observable.just("Hello Single");
Single.fromObservable(source)
	.subscribe(System.out::println)
	.dispose();
  • 기존 Observagble에서 첫번째 값을 발행하면 onSuccess 이벤트를 호출한 후 종료한다.
// 2. single() 함수를 호출해 Single 객체 생성
Observable.just("Hello Single")
	.single("default item")
	.subscribe(System.out::println)
	.dispose();
  • single() 함수는 default value를 인자롤 갖는다. Observable에서 값이 발행되지 않을 때에도 인자로 넣은 기본값을 대신 발행한다.
// 3. first() 함수를 호출해 Single 객체 생성
String[] colors = {"RED", "BLUE", "GOLD"};
Observable.fromArray(colors)
	.first("default value")
	.subscribe(System.out::println)
	.dispose();
  • first()함수를 호출하면 Observable이 Single 객체로 변환된다.
    또한 하나 이상의 데이터를 발행해도 첫 번째 데이터 발해 후 onSuccess 이벤트가 발생한다.
// 4. empty Observable에서 Single 객체 생성
Observable.empty()
	.single("default value")
	.subscribe(System.out::println)
	.dispose();
  • empty() 함수로 Single 객체를 생성한다. Observable에서 값이 발행되지 않을 때에도 기본값을 가지는 Single 객체로 변환할 수 있다.
// 5. take() 함수에서 Single 객체 생성
Observable.just(new Order("ORD-1"), new Order("ORD-2"))
	.take(1)
	.single(new Order("default order"))
	.subscribe(System.out::println)
	.dispose();
  • Single에서 기본 타입 뿐 아니라 사용자 정의 클래스도 사용할 수 있다.
    subscribe()의 인자로 System.out::println 메서드 레퍼런스를 사용하였는데, Order 객체의 toString() 메서드를 호출한다.

잘못된 사용법

Single<String> source = Observable
		.just("Hello Single", "Error")
		.single("default item");
source.subscribe(System.out::println).dispose();
  • just() 함수에 여러 값을 넣으면 오류가 발생한다.

    Caused by: java.lang.IllegalArgumentException: Sequence contains more than one element!

profile
안드로이드 개발자

0개의 댓글