Grusie 안드로이드 개발 기술 블로그

[Android]RxJava 사용하기 본문

안드로이드 개발/라이브러리

[Android]RxJava 사용하기

grusie 2024. 4. 15. 16:13
728x90
반응형
SMALL

안드로이드 프로젝트를 개발 할 때, 항상 의문점이 들었던 것이 이미 지나간 화면에서 다른화면에서의 변화를 감지하여 뷰를 변경해주는 방법이 무엇이 있을까? 였다.

예를 들어, 게시글 리스트 중 하나를 클릭하여, 게시글 상세 페이지로 넘어가고, 그 상세페이지에서 좋아요를 눌렀을 때, 뒤에있는 리스트에도 좋아요 표시가 되어있어야 한다.

"상세 페이지를 실행할 때, startActivtyForResult로 실행하여, 나중에 결과를 반환한다." 이런 방법도 있을 것이다. 하지만 만약, 상세 페이지에서도 연관된 리스트들로 이동할 수 있을 경우라면 어떻게 할 것인가? 계속해서 Depth가 증가한다고 할 때, 그 값을 과연 올바르게 전부 받아올 수 있을까? 내 생각은 아니라고 본다.

그렇게 고민을 하던 중 반응형 프로그래밍 이라는 표현이 있었다.

 

반응형 프로그래밍이란?

주변환경과 끊임없이 상호작용하는 프로그래밍을 의미한다. 변화가 발생하는 곳에서 새로운 데이터를 push하고, Observer에선 그 데이터를 받아서, 사용하면 된다는 것이다.

 

Rxjava는 이런 반응형 프로그래밍을 할 수 있도록 구현되어진 라이브러리이다.

 

사용법

옵저버블 생성

관찰 가능한 Observable 객체를 생성하는 create()함수

val observable : Observable<String> = Observable.create { emitter ->
    emitter.onNext("hello")
    emitter.onNext("android")
    emitter.onComplete()
}
observable.subscribe(
	{data -> Logger.d("데이터 : $data")},
	{error -> Logger.e("에러 : ${error.message}")},
	{Logger.d("데이터 방출 완료")}
)

onNext(), onComplete(), onError()등 개발자가 직접 설정해야한다.

 

Just

val justObserver = Observable.just("Hello", "android")

just 명령어를 활용해, 단순한 데이터 전달도 가능하다.

 

실제 사용

현재 회사에서 진행하는 프로젝트에서는 PublishSubject를 활용하여, EventBus를 만들어 사용하고 있다.

Subject는 옵저버블과 옵저버를 동시에 할 수 있는 중간자 역할의 클래스이다.

private PublishSubject<Object> delete_post = PublishSubject.create(); // 게시글 삭제

예시로 게시글을 삭제했을 때를 보자.

싱글톤으로 생성한 클래스 내에서, 발생하는 이벤트를 전달할 PublishSubject를 생성해두고.

public void set_delete_post(Object item) { delete_post.onNext(item); }
public Observable<Object> get_delete_post() { return delete_post; }

getter, setter를 만들어주고(setter시에 onNext를 사용)

 

// 게시글 삭제
rxEventBus
    ._delete_post
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<Any> {
        override fun onSubscribe(d: Disposable) {
            mCompositeDisposable.add(d)
        }

        override fun onNext(o: Any) {
            val bundle = o as Bundle
            val idx = bundle.getString(Constant.EXTRA_IDX)
            //아이디 값을 가지고 처리할 내용들 입력
        }

        override fun onError(e: Throwable) {}
        override fun onComplete() {}
    })

사용하는 부분에서 구독하여 사용하는 형태이다.

하나씩 살펴보면, 게시글 삭제 시 발생하는 데이터를 백그라운드 스레드에서 구독하고, 그 값을 메인 스레드에서 처리하는 형태인데, 구독을 실행할 때(onSubscribe), Disposable을 등록해두고, 종료될 때, dispose()를 진행한다.

onNext : 이벤트를 받았을 때 처리할 실제 부분

onError : 이벤트 발생 시 에러가 발생했을 때의 처리부분

onComplete : 이벤트 발생이 모두 완료되었을 때의 처리부분

 

Bundle bundle = new Bundle();
bundle.putString(Constant.EXTRA_IDX, postItemVo.getIdx());
bundle.putString(Constant.EXTRA_BOARD_TYPE, postItemVo.getBoard_type());
rxEventBus.set_delete_post(bundle);

이벤트를 발생시키는 부분이다.

bundle을 만들어 idx값과 board_type을 넣어서 이벤트를 발생시킨다.

object형태로 해두었기에 이런 형태로 구현이 가능한 것이다.

 

실제 동작 예시

Rx자바를 활용한 처리작업 덧 입히기

이전에 있던 페이지에서 구독자를 생성해두고, 게시글을 삭제했을 시, 이벤트를 받아서 해당하는 게시글을 리스트에서 삭제해준다.

 

물론 데이터를 새로 불러와도 되겠지만, 불필요한 서버통신을 늘릴 뿐이기에 저렇게 처리를 하였다.

 

참고

https://velog.io/@ryalya/Android-RxJava%EB%9E%80#-subscribe

 

[Android] RxJava란?

21.07.05 공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다. 참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.  + 틀린 부분, 수정해

velog.io

https://selfish-developer.com/entry/RxJava-Subject-PublishSubject-BehaviorSubject

 

RxJava: Subject, PublishSubject, BehaviorSubject

0. Subject RxJava에서 Subject 클래스는 구독하고 있는 관찰자(Observer)에게 새로운 값을 전달 할 때 사용하는 클래스다. 따로 Observable로 새로운 값을 만들 필요 없이 Subject 객체에 내장된 onNext 함수로

selfish-developer.com

 

 

후기

회사에 들어왔을 때, 기존부터 사용하던 방식이었기에 따라 사용하긴 하였으나, 정확한 구조를 고민해본 건 이번인 것 같다. 정말 필요했던 기능이었던 만큼 익혀두면 쓸 곳이 정말 많을 것이다.

사용할 때의 코드들이 너무 많아서 어렵다고 생각하였으나 구조를 알고보니 간단하다는 것을 깨달았다.

반응형
LIST