Devik0213 / memo

메모
1 stars 0 forks source link

RxJava in Android & Sample #14

Open Devik0213 opened 6 years ago

Devik0213 commented 6 years ago

Rx개념 기존 callback 방식이 아닌, event 기반으로 event를 목적에 맞게 구독하며, event 내용을 조건(filter)/변형(transform)/구독(subscribe) 등을 해가며 처리하는 방식. platform 레벨에서 지원해줘서 사용이 쉽고, 안정적이다.

실재 장점

Observable(관찰/구독 대상) / Observer(관찰/구독 자)

React의 핵심개념은, 이벤트기반으로 데이터가 흘러가니, ViewModel, Controller, View.. 등에서 서로간의 통신에 대한 interface를 만들거나, 비동기후의 getter/setter 등의 동기문제들으로 부터 자유로워 진다.

Operator

Scheduler 참고

subscribeOn, observeOn

SubscribeOn은 Observable이 작동 할 스케줄러를 지정합니다. 링크 ObserveOn은 관찰자가 Observable 을 관찰 할 스케줄러를 지정하십시오. 링크 작동(UI작업이라던가, Handler), 관찰(로깅, 트레이싱)을 하는 작업의 내용

Disposable (버릴수있는)

Observable 에서 생성하는 이벤트 스트림과 필요로하는 리소스 관리 CompositeDisposable 을 통해 Activity/Fragment Lifecycle 에 맞는 request cancel 효과를 구현할수있다.

Retrofit & RxJava 연동 Sample

프로젝트 진행하며, 필수 전처리

1. 프로젝트 추가 책 Sample

1. 라이브러리 추가

// project > build.gradle > buildscript  > ext.retrofitVersion 2.4.0 정의
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
    implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"

2. Retrofit.addCallAdapterFacroty()

//  GithubApiProvider.kt
Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
//Call Adapter 에 RxJava에서 제공하는 Scheduler 와 비동기 작업처리에 대한 instance 생성. 

RxJava Observable 로 만드는 과정은, method 참고

RxJava2CallAdapterFactory.class
  public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) 

Disposable & Map(transform)

 private fun getAccessToken(code: String) {
        var gettingAccessTokenObservable = api.getAccessToken( // : Observable<GithubAccessToken>
                BuildConfig.GITHUB_CLIENT_ID, BuildConfig.GITHUB_CLIENT_SECRET, code)
                .map { it.accessToken } // 이후부터 string 으로 변경됨.
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe { showProgress() }
                .doOnTerminate { hideProgress() }
                .subscribe({ token ->
                    authTokenProvider.updateToken(token)
                    launchMainActivity()
                }) {
                    showError(it)
                }
//        disposables.add(gettingAccessTokenObservable)
        disposables += gettingAccessTokenObservable
//
    }

RxBinding

JakeWharton 이 만든 View/Lifecycle 에 특화된 observe 이벤트 발생 https://github.com/JakeWharton/RxBinding