티스토리 뷰

반응형



실질적으로 RxJava을 사용하는 코드를 공유 하겠습니다.


먼저 소스를 보시면 SampleRepositoryActivity 로 코틀린으로 표현한 소스 입니다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class SampleRepositoryActivity : AppCompatActivity(){
    
    ...
        
    // 여러 디스포저블 객체를 관리할 수 있는 CompositeDisposable 객체를 초기화 합니다.
    interanl val disposables = CompositeDisposable()
    ...
    override fun onStop(){
        super.onStop()
        // 관리하고 있던 디스포저블 객체를 모두 해제합니다.
        dislosables.clear()
    }
    private fun showSampleRepositoryInfo(data: String){
        
        //REST API를 통해 저장소 정보를 요청합니다.
        disposables.add(api.getSampleRepository(data)
            
            // REST API를 통해 받은 응답에서 원하는 값을 추출합니다.    
            .map { ... }    
            
            // Observable 형태로 결과를 바꿔주기 위해 flatMap을 사용합니다.
            .flatMap {
                if ( 0 == it.cnt) {
                    // 에러가 발생시켜 에러 메시지를 표시하도록 합니다.
                    // (곧바로 에러 블록이 실행됩니다.)
                    Observable.error(IllegalStateException("No search result"))
                }else {
                    // 검색 결과 리스트를 다음 스트림으로 전달합니다.
                    Observable.just(it.items)
                }
            }
            
            // 이후 수행할 스레드를 메인으로 설정할 경우 AndroidSchedulers.mainThread()을 사용합니다.
            .observeOn(AndroidSchedulers.mainThread())
            
            // 구독 시 수행할 작업을 구현합니다.
            .doOnSubscribe {
                ...
            }
            
            //  스트림이 종료될 때 수행할 작업을 구현합니다.
            .doOnTerminate {
                ...
            }
            
            // 옵서버블을 구독합니다.
            .subscribe({ 
                    // 작업 도중 오류가 발생하면 이 블록은 호출되지 않습니다.
                    ...
            }) {
                    // 에러 블록
                    ...
            }
    }    
}
cs


자세하게 표현하는 것보다 구성이 이렇게 될 수 있다는 정도로 표현하였습니다. 


CompositeDisposable로 여러개의 디스포저블 객체를 하나의 객체로 표현하였고 stop()에서 CompositeDisposable.clear()로 리소스 반환하였습니다. 구독 전에 map, flatMap 하는 부분과 Android Main Thread 설정, subscribe 하는 방법은 주석을 참고해서 보시면 표현하는데 어려움이 없을 것 같습니다. 


RxJava을 통한 REST API 활용 

API에 호출 시 옵저버블(Observable) 생성하여 CompositeDisposable()로 관리하는 로직 순서를 간단히 소개하겠습니다.


RxJava을 통한 REST API 순서


[1] REST API 통신 하기 위해 retrofit2 라이브러리 사용하는데 API 호출하는 시점에 옵저버블을 생성 합니다.

[2] REST API 호출 한 옵저버블(Observable) 생성하면 디스포저블(Disposable) 생성됩니다.

[3] 디스포저블에서 사용 목적에 맞게 구성합니다.

[4] 이 생성된 디스포저블은 CompositeDisposable 에 추가합니다.

[5] onStop() 메서드 호출 시 CompositeDisposable.clear()로 리소스 반환합니다.


RxJava로 이용한 RxAndroid는 REST API 통신과 함께 UI 이볜트에서도 사용 가능합니다.


RxBinding을 활용한 UI 이벤트

안드로이드에서 사용할 수 있는 여러 UI 위젯에서 리스너를 통해 받을 수 있는 이벤트를 옵서버블 형태로 제공합니다.


RxBinding 라이브러리 정리


'android Platform bindings'

    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'


'support-v4' library bindings:

    compile 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0'


'appcompat-v7' library bindings:

    compile 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.0.0'


'design' library bindings:

    compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'


'recyclerview-v7' library bindings:

    compile 'com.jakewharton.rxbinding2:rxbinding-recyclerview-v7:2.0.0'


'leanback-v17' library bindings:

    compile 'com.jakewharton.rxbinding2:rxbinding-leanback-v17:2.0.0'


위의 라이브러리를 gradle에 추가하여 RxBinding 을 사용 할 수 있습니다.


UI 위젯에서 리스너를 통해 받을 수 있는 이벤트를 옵서버블 형태로 제공한다고 위에서 언급하였습니다. 옵서버블(Observable)로 생성 후 디스포저블(Disposable) 객체가 생성되면 CompositeDisposable()로 관리합니다.


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
32
33
34
35
36
37
38
class SampleRxBindingActivity : AppCompatActivity(){
    
    ...
        
    // 여러 디스포저블 객체를 관리할 수 있는 CompositeDisposable 객체를 초기화 합니다.
    interanl val viewDisposables = CompositeDisposable()
    ...
    override fun onStop(){
        super.onStop()
        // 관리하고 있던 디스포저블 객체를 모두 해제합니다.
        viewDisposables.clear()
    }
    
    // 텍스트 변경에 따른 이벤트
    private fun sampleQueryTextChnageEvents(){ 
        viewDisposables += RxSearchView.queryTextChnageEvents(searchView)
            // filter로 설정한 이벤트만 받습니다.
            .filter { ... }
            
            // 이벤트에서 추출 특정 데이터 시도 시 사용합니다.
            .map { ... }    
            
            
            // 이후 수행할 스레드를 메인으로 설정할 경우 AndroidSchedulers.mainThread()을 사용합니다.
            .observeOn(AndroidSchedulers.mainThread())
            
            // 옵서버블을 구독합니다.
            .subscribe({ 
                    // 작업 도중 오류가 발생하면 이 블록은 호출되지 않습니다.
                    ...
            }) {
                    // 에러 블록
                    ...
            }
    }  
    ...  
}
 
cs



RxBinding 활용 순서


[1] RxBinding으로 이벤트를 옵서버블 형태로 받습니다.

[2] 이벤트를 통한 옵저버블(Observable) 생성하면 디스포저블(Disposable) 됩니다.

[3] 디스포저블에서 사용 목적에 맞게 구성합니다.

[4] 이 생성된 디스포저블은 CompositeDisposable 에 추가합니다.

[5] onStop() 메서드 호출 시 CompositeDisposable.clear()로 리소스 반환합니다.




정리

RxJava을 실질적으로 소스에서 어떤한 순서로 구성되는지 알아봤습니다. 옵서버블을 생성하면 디스포저블이 생성되고 생성된 디스포저블을 CompositeDisposable에 추가합니다. 추가한 CompositeDisposable를 화면 단위로 리소스 관리 하는 로직으로 구성한다면 RxJava 적용하는데 도움이 될 것으로 예상됩니다.



[Android][RxJava] RxJava와 RxAndroid [1 / 2]



참고


반응형
댓글