일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- coroutine
- 로그인
- 커스텀뷰
- Kotlin
- 클린아키텍처
- Authentication
- ListAdapter
- 플레이스토어
- 코틀린
- Jetpack
- 안드로이드
- Build variants
- Flow
- MVVM
- Compose
- 회원가입
- NavHost
- 뷰
- 파이어베이스
- NavController
- 알고리즘
- DiffUtil
- 컴포즈
- cleanarchitecture
- 코딩테스트
- Android
- XML
- sharedFlow
- 리사이클러뷰
- UiState
- Today
- Total
Grusie 안드로이드 개발 기술 블로그
[Android]RxJava 사용하기 본문
안드로이드 프로젝트를 개발 할 때, 항상 의문점이 들었던 것이 이미 지나간 화면에서 다른화면에서의 변화를 감지하여 뷰를 변경해주는 방법이 무엇이 있을까? 였다.
예를 들어, 게시글 리스트 중 하나를 클릭하여, 게시글 상세 페이지로 넘어가고, 그 상세페이지에서 좋아요를 눌렀을 때, 뒤에있는 리스트에도 좋아요 표시가 되어있어야 한다.
"상세 페이지를 실행할 때, 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형태로 해두었기에 이런 형태로 구현이 가능한 것이다.
실제 동작 예시
이전에 있던 페이지에서 구독자를 생성해두고, 게시글을 삭제했을 시, 이벤트를 받아서 해당하는 게시글을 리스트에서 삭제해준다.
물론 데이터를 새로 불러와도 되겠지만, 불필요한 서버통신을 늘릴 뿐이기에 저렇게 처리를 하였다.
참고
https://velog.io/@ryalya/Android-RxJava%EB%9E%80#-subscribe
https://selfish-developer.com/entry/RxJava-Subject-PublishSubject-BehaviorSubject
후기
회사에 들어왔을 때, 기존부터 사용하던 방식이었기에 따라 사용하긴 하였으나, 정확한 구조를 고민해본 건 이번인 것 같다. 정말 필요했던 기능이었던 만큼 익혀두면 쓸 곳이 정말 많을 것이다.
사용할 때의 코드들이 너무 많아서 어렵다고 생각하였으나 구조를 알고보니 간단하다는 것을 깨달았다.
'안드로이드 개발 > 라이브러리' 카테고리의 다른 글
[Android] Data binding 기본 사용법 및 BindingAdapter (0) | 2024.04.26 |
---|---|
[Android] 이미지 로딩 라이브러리 Glide, Fresco (Glide를 사용한 이유) (1) | 2024.04.19 |
[Android] Retrofit2 사용법 (0) | 2024.03.27 |
[Android] Compose + Paging 검색 기능 만들기(Flow - debounce) (1) | 2024.03.12 |
[Android] JetPack:Compose 네비게이션(navigation) - 2 (0) | 2024.03.07 |