RxJava2CallAdapterFactory 알아보기

유재민·2023년 5월 8일
0
post-custom-banner

RxJava2 를 사용하면서 이것 저것 적용해보다가 RxJava2CallAdapterFactory 라는 메서드를 적용하게 되었다. squareup에서 제공하는 retrofit과 rxjava의 adapter 라이브러리를 추가하여 사용할 수 있다.

@Provides
@Singleton
fun providePostRetrofit(
    okHttpClient: OkHttpClient,
    converterFactory: Converter.Factory,
): Retrofit {
    return Retrofit.Builder()
        .baseUrl(BuildConfig.NAVER_BASE_URL)
        .client(okHttpClient)
        .addConverterFactory(converterFactory)
        .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
        .build()
}

위 코드는 Hilt의 모듈에서 retrofit 인스턴스를 생성하는 코드이다. addCallAdapterFactory 의 인자로 RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()) 의 코드를 넣게된다.

여기서 의문이 발생했다. 이 코드는 어떤 동작을 하는 코드일까? 분명 viewModel에서 Observable를 구독하는 부분에서 subscribeOn(Schedulers.io()) 를 추가하여 스케줄러를 지정했었는데 또 지정할 필요가 있을까? 라는 의문이었다.

compositeDisposable.add(
    getBlogListUseCase(query)
        .subscribeOn(Schedulers.io()) // 여기서 분명 스케줄러 지정해줬는데..
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ blogs ->
            val result = blogs.map { blog ->
                blog.toPresentation()
            }

            _state.value = if (result.isNotEmpty()) {
                PostState.Success(result)
            } else {
                PostState.Empty
            }
        }, {
            _state.value = PostState.Failure
        })
)

이 메서드에 대해서 알아보고자 내부코드를 살펴보았다.

💡 Returns an instance which creates synchronous observables that subscribe on scheduler by default.

스케줄러를 구독하는 동기 observable을 만드는 인스턴스를 반환한다. 여기서 subscribe on 을 누르면 우리고 알고있던 그 메서드가 나온다.

즉, CallAdapterFactory를 통해 Retrofit에서 Observable이 작동할 스케줄러를 지정해주면 중복해서 subscribeOn 메서드를 사용할 필요가 없다는 것이다.

profile
유잼코딩
post-custom-banner

0개의 댓글