본문 바로가기

안드로이드

안드로이드 RxJava #1 기초 내용 (PublishSubject)

 

안녕하세요

오늘부터 RxJava에 대한 글을 작성하려 합니다.

RxJava는 비동기 처리를 할 때 사용합니다.

 

비교적 쉬운 AsyncTask를 이용해 비동기 처리를 할 수 있습니다. 

하지만 AsyncTask는 안드로이드11부터 Deprecated 되었습니다. 

Deprecated는 중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 된다는 뜻이라고 하네요

오래된 핸드폰에서는 AsyncTask를 사용해도 문제는 없지만 앞으로 새로운 스마트폰이 나올 예정이고 안드로이드 11 이상이기 때문에 비동기 처리를 할 때는 RxJava 또는 Coroutine을 많이 이용한다고 합니다.

 

우선 RxJava를 사용하기 전에 동기, 비동기가 무엇인지 알아보고 시작하겠습니다.

1. 동기

서버에 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행합니다.

A작업 이후 B작업이 예정돼있으면 A작업이 모두 끝나야 B작업을 할 수 있습니다.

 

2. 비동기

동기와 반대로 서버에 요청을 보냈을 때 응답 여부와 관계없이 다음 동작을 수행합니다.

A작업 이후 B작업이 예정돼 있으면 A작업을 시작하고 응답 여부와 관계없이 B작업을 수행합니다.

이후 응답받은 내용은 순서와 상관없이 UI를 업데이트할 것입니다.

 

그렇다면 비동기 프로그래밍을 하는 이유는 무엇일까요?

아주 단적인 예를 들어보겠습니다.

만약 우리가 많이 사용하는 유튜브가 비동기가 아닌 동기로 데이터를 처리하면 어떻게 될까요?

유튜브를 클릭하는 순간 최상단에 있는 유튜브 로고부터 하나씩 서버에 응답하고 하나씩 로딩될 것입니다. 

답답하죠..?ㅎㅎㅎ

 

이에 대한 해결책은 비동기 처리를 하는 것입니다.

동시다발적으로 업무를 수행하기 때문에 더 유동적이고 효율적으로 많은 일을 할 수 있습니다.

 

본격적으로 시작하기 전에 이번 블로그에 Observable를 보시면 조금 더 이해가 수월할 수 있을 겁니다.

https://adc6981.tistory.com/m/13

 

안드로이드 LiveData 사용 방법

안녕하세요 이번 시간에는 LiveData에 대해 알아보겠습니다. LiveData는 Observer기법을 사용합니다. LiveData는 관찰 가능한 데이터 홀더 클래스입니다. 쉽게 말해서 Observer가 LiveData를 관찰하고 있으며

adc6981.tistory.com

 

 

RxJava를 길게 표현하자면 리액티브프로그래밍을 할 수 있는 라이브러리라고 할 수 있습니다.

반응형 프로그램이라고 표현합니다.

 

오늘은 명령형 프로그램과 반응형 프로그램의 차이에 대해 알아보겠습니다.

우선 Module버전 gradle에 다음과 같은 내용을 추가해줍니다.

implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.7'

 

명령형 프로그램

ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);

        for(Integer item : arrayList){
            if(item % 2 == 0){
                Log.e("arrayList",item.toString());
            }
        }
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(7);
        arrayList.add(8);

 

ArratList에 1부터 8까지 담았습니다.

출력을 할 건데  4와 5 사이에서 출력을 해보겠습니다.

 

결과값으로 2와 4가 출력됩니다.

 

위에서 아래로 코드가 실행됩니다.

ArratList에 1,2,3,4를 담고 출력을 하니 당연히 2와 4만 출력이 될 겁니다.

 

 

반응형 프로그래밍

PublishSubject<Integer> items = PublishSubject.create();
        items.onNext(1);
        items.onNext(2);
        items.onNext(3);
        items.onNext(4);

        items2.filter(item -> item % 2 == 0)
                .subscribe(data -> Log.e("Data",data.toString()));

        items.onNext(5);
        items.onNext(6);
        items.onNext(7);
        items.onNext(8);

아까와 동일한 구간에 출력문을 만들었습니다.

결과는 6과 8이 출력됩니다.

 

 

그림을 보면 조금 이해하기 수월할 겁니다.

PublishSubject의 데이터 흐름은 1,2,3... 7,8입니다.

4 다음 짝수만 출력하는 조건문을 만들고 subscribe를 통해 PublishSubject를 구독해 줍니다.

구독하는 시점 이후의 데이터만 옵저버에 전달하기 때문에 6, 8이 출력된 것입니다.

 

다음 시간에는 Observable()의 사용법에 대해 업로드하겠습니다.

수고하셨습니다!

 

 

 

 

 

반응형