세상을 바꾸는 개발자

[RxJava] Observable로 변환하기(fromArray, fromIterable, fromFuture, fromPublisher, fromCallable) 본문

안드로이드/RxJava

[RxJava] Observable로 변환하기(fromArray, fromIterable, fromFuture, fromPublisher, fromCallable)

헬창코딩 2021. 8. 23. 22:39

안녕하세요~  헬창코딩입니다. 

이번에는 Rxjava에서 이미 참조할 수 있는 배열 및 리스트 등의 자료구조나 Future, Callable 또는 Publisher가 있다면 

from으로 시작하는 연산자를 통해 Observable로 변환하는 작업을 해보도록 하겠습니다. 

 

from과 관련된 메서드입니다.

 

fromArray()

-> 배열을 ObservableSource로 변환하여 아이템을 순차적으로 발행합니다.

 

fromIterable()

-> ArrayList, HashSet처럼 Iterable을 구현한 모든 객체를 ObservableSource로 변환하여 아이템을 순차적으로 발행합니다. 

 

fromFuture() 

-> Future 인터페이스를 지원하는 모든 객체를 ObservableSource로 변환하고 Future.get() 메서드를 호출한 값으로 변환합니다.

 

fromPublisher()

-> Publisher를 Observable로 변환합니다.

 

fromCallable()

-> Callable을 Observable로 변환합니다.

 

 

하나씩 예제를 통해서 살펴보도록 하겠습니다!!

 

 

 

 

fromArray() 연산자

가지고 있는 아이템들이 배열일 경우에는 fromArray() 연산자를 이용하여 아이템을 순차적으로 발행할 수 있습니다. 

 

        String[] itemArray = new String[]{"h", "e", "a", "l"};
        Observable source = Observable.fromArray(itemArray);
        source.subscribe(t -> Log.d("log_test", "" + t), throwable -> Log.d("log_test", "error!!!"));

결과 

 

 

 

fromIterable() 연산자

ArrayList, Hashset 등과 같이 일반적으로 Iterable을 구현한 자료 구조 클래스는 fromIterable() 연산자를 통해 쉽게 Observable로 변환이 가능합니다. 예제를 통해 알아볼게요 

        ArrayList<String> list = new ArrayList();
        list.add("h");
        list.add("e");
        list.add("a");
        list.add("l");
        Observable source = Observable.fromIterable(list);
        source.subscribe(t -> Log.d("log_test", "" + t));

결과 

 

 

 

fromFuture 연산자

Future 인터페이스는 비동기적인 작업의 결과를 구할 때 사용합니다. 보통 Executor Servuce를 통해 비동기적인 작업을 할 때 사용합니다.  Future 또한 fromFuture() 연산자를 통해 Observable로 변경이 가능합니다. Emitter은 Observable 내부에서 Future.get() 메서드를 호출하고, Future의 작업이 끝나기 전까지 스레드는 블로킹됩니다. 

Future<String> future = Executors.newSingleThreadExecutor()
                .submit(() -> {
                    Thread.sleep(5000);
                    return "health";
                });
        Observable source = Observable.fromFuture(future);
        source.subscribe(t -> Log.d("log_test", "" + t)); //블로킹되어서 기다립니다. 그후 5초뒤 출력

 

결과

 

 

 

fromPublisher() 연산자

Publisher는 잠재적인 아이템 발행을 제공하는 생산자로 Subscriber로부터 요청을 받아 아이템을 발행합니다. fromPubliser() 연산자를 통해 Publisher를 Observable로 변환할 수 있습니다.

    Publisher<String> publisher = s -> {
            s.onNext("h");
            s.onNext("e");
            s.onNext("a");
            s.onNext("l");
            s.onComplete();
        };
        Observable source = Observable.fromPublisher(publisher);
        source.subscribe(t -> Log.d("log_test", "" + t));

 

결과

 

 

 

fromCallable() 연산자

callable 인터페이스는 비동기적인 실행결과를 반환한다는 점이 Runnable과 다릅니다. fromCallable() 연사자를 통해 Callable을

Observable로 변환하고 비동기적으로 아이템을 발행할 수 있습니다.

 Callable<String> callable = () -> "healchang coding";
        Observable source = Observable.fromCallable(callable);
        source.subscribe(t -> Log.d("log_test", "" + t));

결과

 

 

이렇게 몇가지 연사자를 살펴보았지만 Observable 이뢰에 조금 특별한 스트림들이 존재합니다. 바로 Single, Maybe, Completable입니다. 이것들은 다음 시간에 알아보겠습니다. 

Comments