엄코딩의 개발 일지

 RxJava



이번 포스팅은 RxJava2를 적용한 Android Retrofit 통신입니다.


  • RxJava ReactiveX에서 함수형(Functional)이라는 단어를 설명하듯 옵저버블 스트림 상에서 간결한 인풋과 아웃풋 펑션을 이용해서 복잡한 상태 없는 프로그램 환경을 만드는 것입니다.
  • Reactive 프로그래밍의 핵심 요소
  •  데이터의 강을 만드는 Observable
  •  데이터의 강에서 데이터를 하나씩 건지는 Subscriber


 RxJava2



- 더 이상 null값을 보낼 수 없다.


- Observable 에서 null을 보내게 되면 바로 NullPointerException이 발생.


- > Completable, Maybe 사용 또는 enum을 선언하여 null 대신 enum을 emit(발생)하는 방법으로 대체 가능.



//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

//RxJava, RxAndroid
implementation 'io.reactivex.rxjava2:rxjava:2.1.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'

( RxBinding은 뷰에 이벤트 Observable을 붙이기 위해 사용. )

retrofit = Retrofit.Builder()
.baseUrl(USE_DOMAIN)
.addConverterFactory(GsonConverterFactory.create())
.client(clientImp.build())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()

기존의 레트로핏 담당 싱글톤을 생성하는 과정에서 추가된 코드는 다음과 같습니다.

.addConverterFactory(GsonConverterFactory.create())

예제에서 사용할 Api 입니다. ( 포스팅을 목적으로 임값을 넣었습니다. )

//RxJava2 Test
@FormUrlEncoded
@POST(API_ADDRESS)
fun inquiry2(@Header(USER_TOKEN) token : String,

@Field("email") email : String,
@Field("content") content : String) : Single<DataResult>

Single의 경우에는 Observer에 onSuccess (또는 onError) 밖에 없으므로 값이 하나만 떨어진다는 것을 좀 더 명확하게 할 수 있습니다.

interface ResultListener {
fun onRxNetSuccess(result: DataResult)
fun onRxFailed()
}

fun onRxTest(listener : ResultListener) {
val single = Net.giveRetrofitFactory().inquiry2(
TOKEN,
EMAIL,
CONTENT)
single.subscribeOn(Schedulers.io())


//동기 I/O를 별도로 처리시켜 비동기 효율을 얻기 위한 스케줄러.
//자체적인 스레드 풀 CachedThreadPool을 사용. API 호출 등 네트워크를 사용한 호출 시 사용.

//observeOn : 지정한 스케줄러는 이후에 따라오는 Operator, Subscriber에 적용.
//AndroidSchedulers.mainThread() : 안드로이드의 UI 스레드에서 동작


.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{

listener.onRxNetSuccess(it)
},{e->
listener.onRxFailed()
e.printStackTrace()
if(e is HttpException){
when(e.code()){
STATUS_CODE
-> {

            // 명시한 스테이터스 코드에 상응하는 오류 부분

}
else ->{


// 명시한 스테이터스 코드에 상응하는 오류 부분

}
}
}
else{


//Network 오류 부분


}
})

}


인터페이스를 통해 리스너 구현을 강제하여 onSuccess (또는 onFail)을 구현했습니다.


이상으로 RxJava2를 이용하여 Retrofit 통신을 구현해보았습니다.


조언이나 문의사항 있으신분 환영입니다 !!




참고사이트



http://programmingfbf7290.tistory.com/entry/8-%EC%98%88%EC%A0%9C%EB%A5%BC-%ED%86%B5%ED%95%B4-%EB%B0%B0%EC%9A%B0%EB%8A%94-RxJava%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-Retrofit2 

http://developer88.tistory.com/146 

https://academy.realm.io/kr/posts/rxandroid/?w=1 

https://medium.com/rainist-engineering/migrate-from-rxjava1-to-rxjava2-3aea3ff9051c