just()함수 사용
Single 클래스는 Observable 클래스와 거의 같은 방법으로 활용이 가능하다.
아래 코드는 just() 함수를 활용해 Single 객체를 생성하는 코드이다.
private void single(){
Single<String> source = Single.just("Hello Single");
source.subscribe(System.out::println);
}
결과값
Hello Single
Observable에서 Single 클래스 사용
Single은 Observable의 특수한 형태이므로, Observable에서 변환할 수있다.
아래 코드는 Observable에서 Single 클래스를 사용하는 다양하는 방법이다.
private void fromObservable(){
//1. 기존 Observable에서 Single 객체로 변환하기.
Observable<String> source = Observable.just("Hello Single");
Single.fromObservable(source)
.subscribe(System.out::println);
//2. single() 함수를 호출해 Single 객체 생성하기
Observable.just("Hello Single")
.single("default item")
.subscribe(System.out::println);
//3. first() 함수를 호출해 Single 객체 생성하기
String[] colors = {"Red", "Blue", "Gold"};
Observable.fromArray(colors)
.first("default value")
.subscribe(System.out::println);
//4. empty Observable에서 Single 객체 생성하기
Observable.empty()
.single("default value")
.subscribe(System.out::println);
//5. take() 함수에서 Single 객체 생성하기
Observable.just(new Order("ORD-1"), new Order("ORD-2"))
.take(1)
.single(new Order("default order"))
.subscribe(System.out::println);
}
public class Order {
private String mId;
public Order(String id){
mId = id;
}
public String getId(){
return mId;
}
@Override
public String toString() {
return "Order ID: " + mId;
}
}
결과값
Hello Single
Hello Single
Red
default value
Order ID: ORD-1
첫 번째 예는 Single.fromObservable을 활용하는 방법이다.
기존 Observable에서 첫 번째 값을 발행하면 onSuccess 이벤트를 호출한 후 종료한다.
두 번째 예는 Observable.just()를 통해서 생성된 Observable에 single() 함수를 호출한다.
single()함수는 default value를 인자로 갖는다.
Observable에서 값이 발행하지 않을 때에도 인자로 넣은 기본값이 대신 발행된다.
세 번째 예는 여러개의 데이터를 발행할 수 있는 Observable을 Single 객체로 변환하는 것이다.
first() 함수를 호출하면 Observable이 Single 객체로 변환된다.
또한, 하나 이상의 데이터를 발행하더라도, 첫 번째 데이터 발행 후 onSuccess 이벤트가 발생한다.
자세한 내용은 추후에 설명하도록하겠다.
네 번째 예는 empty() 함수를 통해서 Single 객체를 생성하는 방법이다.
세 번째 방법처럼 첫 번째 데이터를 발행 후 onSuccess 이벤트가 발생한다는 점이 같다.
또한 두 번째 예처럼 Observalbe에서 값이 발행되지 않을 때도 기본값을 갖는 Single 객체를 변환할 수 있다.
마지막 다섯 번째 예는 take() 함수를 사용하는 방법이다.
take()에 대한 자세한 내용은 나중에 다룰것이다.
여기서는 Single 객체를 생성할 수 있다는 정도만 알고 넘어가도록 하자!
String 같은 기본 타입뿐만 아니라, Order와 같은 사용자 정의 클래스도 Single에서 사용할 수 있다.
Single 클래스에 넘겨진 Order 객체의 toString() 메서드가 호출된다.
Single 클래스의 올바른 사용 방법
지금까지 Observable에서 Single 객체를 생성할 때 데이터 하나만 발행하도록 보장했다.
하지만, 실제 just()함수에 여러개의 값을 넣으면 어떻게 될까??
private void errorCase(){
Single<String> source = Observable
.just("Hello Single", "Error")
.single("default item");
source.subscribe(System.out::println);
}
Caused by: java.lang.IllegalArgumentException: Sequence contains more than one element!
위와 같은 에러가 발생한다.
에러 메시지는 element가 하나 이상이라고 뜨게 된다.
그리고 두 번째 값을 발행하면서 onNext() 이벤트가 발생하면서 에러가 발생했다고 알려주게 된다.
즉, Single 클래스를 사용할 때는 하나의 발행에 대해서만 처리할 수 있도록 주의하자.
'프로그래밍 > RxJava' 카테고리의 다른 글
[RxJava] 뜨거운 Observable (0) | 2020.02.20 |
---|---|
[RxJava] Maybe 클래스 (0) | 2020.02.17 |
[RxJava] Single 클래스 (0) | 2020.02.16 |
[RxJava] Observable - fromPublisher() 함수 (0) | 2020.02.16 |
[RxJava] Observable - fromFuture() 함수 (0) | 2020.02.16 |