본문 바로가기
Programming 개발은 구글로/JAVA[Android]

[RxJava] 5.subscribeOn과 observeOn의 차이점

by 40대직장인 2022. 5. 25.

subscribeOn과 observeOn의 차이

 

RxJava는 operator를 통해 chaining 기법을 사용할 수 있다. subscribeOn과 observeOn도 마찬가지로 chaining 기법을 적용할 수 있다.

 

먼저 두 연산자의 역할은 다음과 같다.

subscribeOn은 Observable이 데이터 흐름을 발생시키고 연산하는 스레드를 지정할 수 있고, observeOn은 Observable이 Observer에게 알림을 보내는 스레드를 지정할 수 있다.

그럼 두 연산자의 차이는 무엇일까?

 

subscribeOn은 여러번 호출되더라도 맨 처음의 호출만 영향을 주며 어디에 위치하든 상관없다.

observeOn은 여러번 호출될 수 있으며 이후에 실행되는 연산에 영향을 주므로 위치가 중요하다.

 

 

예제

 

ArrayList<MyShape> shapes = new ArrayList<>();
shapes.add(new MyShape("Red", "Ball"));
shapes.add(new MyShape("Green", "Ball"));
shapes.add(new MyShape("Blue", "Ball"));

Observable.fromIterable(shapes)
        .subscribeOn(Schedulers.computation())           
        .subscribeOn(Schedulers.io())            
        .doOnSubscribe(data -> MyUtil.printData("doOnSubscribe"))
        .doOnNext(data -> MyUtil.printData("doOnNext", data))
        .observeOn(Schedulers.newThread()) 
        .map(data -> {data.shape = "Square"; return data;})
        .doOnNext(data -> MyUtil.printData("map(Square)", data))
        .observeOn(Schedulers.newThread()) 
        .map(data -> {data.shape = "Triangle"; return data;})
        .doOnNext(data -> MyUtil.printData("map(Triangle)", data))
        .observeOn(Schedulers.newThread())  
        .subscribe(data -> MyUtil.printData("subscribe", data));

Result:
main | doOnSubscribe |
RxComputationThreadPool-1 | doOnNext | MyShape{color='Red', shape='Ball'}
RxComputationThreadPool-1 | doOnNext | MyShape{color='Green', shape='Ball'}
RxComputationThreadPool-1 | doOnNext | MyShape{color='Blue', shape='Ball'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Red', shape='Square'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Green', shape='Square'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Blue', shape='Square'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Red', shape='Triangle'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Green', shape='Triangle'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Blue', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Red', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Green', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Blue', shape='Triangle'}

 

 

예제에서 사용한 MyShape과 MyUtil 클래스이다.

 

class MyShape{
    String color;
    String shape;

    MyShape(String color, String shape) {
        this.color = color;
        this.shape = shape;
    }

    @Override
    public String toString() {
        return "MyShape{" +
                "color='" + color + '\'' +
                ", shape='" + shape + '\'' +
                '}';
    }
}

class MyUtil {
    static void printData(String message) {
        System.out.println(""+Thread.currentThread().getName()+" | "+message+" | ");
    }

    static void printData(String message, Object obj) {
        System.out.println(""+Thread.currentThread().getName()+" | "+message+" | " +obj.toString());
    }
}

 

 

 

댓글