스태틱하게 개발중

[Android] RxJava를 사용하여 Room 데이터 사용하기 본문

Android

[Android] RxJava를 사용하여 Room 데이터 사용하기

야무치리링 2022. 2. 11. 23:43

RxJava를 사용하여 Room 데이터베이스는 비동기로 처리하는 방법을 정리해보려고 한다.

 

먼저 의존성 추가를 해준다.

implementation "androidx.room:room-rxjava2:2.2.6"

아래는 구글에서 제공하는 샘플예제이다.

 

User의 정보를 삽입을 하기위한 instertUser 함수에 Completable 사용했는데 이는 데이터를 통지 하지 않고 해당 작업만 하기 위함이다. 즉, 데이터를 insert에 대한 결과는 필요없고 단지 실행만 되면 된다.

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUser(user: User): Completable

 

데이터를 가져올때 User의 정보를 가져올경우 Single을 사용한다. 

@Query("SELECT * FROM Users WHERE userId = :id")
fun getUserById(id: String): Single<User>

@Query("SELECT * FROM Users")
fun getAllUser(): Single<User>

 

데이터를 삭제할때도 쿼리요청에 대한 결과값이 필요없으므로 Completable을 사용한다.

@Query("SELECT * FROM Users WHERE userId = :id")
fun deleteUserById(id: String): Completable<User>

@Query("SELECT * FROM Users")
fun deleteAllUser(): Completable<User>

 

사용하는 방법은 아래와 같다. subscribeOn에는 Room Dao쿼리를 수행하기 위한 별도의 작업스케쥴러를 넣어준다.

이후 다시 observeOn에서 MainThread로 변경하여 subscribe에서 결과값을 처리해줘 UI에 적용한다.

 

class UserActivity : AppCompatActivity() {

	private val disposable = CompositeDisposable()

	private fun insertUserName() { 
        disposable.add(insertUserName(userName)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ success Event },
                    { error -> handle error }))
    }
}

CompositeDisposable은 생성된 Observable을 라이클사이클에 맞춰 해지하기 위한 클래스이다. 일반적으로 onDestory()에서dispose()를 하여 메모리 누수를 막는다.