투케이2K

77. (TWOK/ALGORITHM) [RxKotlin] 문법 - [Observable] create 사용해 생성자 만들기 및 subscribe 구독 결과 메시지 확인 본문

투케이2K 알고리즘

77. (TWOK/ALGORITHM) [RxKotlin] 문법 - [Observable] create 사용해 생성자 만들기 및 subscribe 구독 결과 메시지 확인

투케이2K 2023. 1. 9. 06:09

[환경 설정 및 설명]

언 어 : RxKotlin

설 명 : 문법 - [Observable] create 사용해 생성자 만들기 및 subscribe 구독 결과 메시지 확인

 

[설 명]

        /**
         * // -----------------------------------------
         * [요약 설명]
         * // -----------------------------------------
         * 1. 개발 환경 : 안드로이드 스튜디오
         * // -----------------------------------------
         * 2. Rx 관련 라이브러리 설치 (build.gradle) :
         *
         * implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
         * implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1'
         * implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
         *
         * // -----------------------------------------
         * 3. Rx 관련 설명 :
         *
         * ReactiveX 는 관찰가능한 절차를 통해 비동기, 이벤트 기반 프로그램을 구성하기 위한 라이브러리 입니다
         * ReactiveX 는 Observer Pattern 옵저버 패턴 을 확장하며, Sequence 를 조합할 수 있는 연산자를 지원 합니다
         * ReactiveX 는 low-level Thread, 동기화, Thread 안전성, non-blocking I/O에 관한 우려를 줄입니다
         * // -----------------------------------------
         * 4. Observable 구분 종류 설명 (Cold / Subject) :
         *
         * RxJava 의 Observable 에는 [Cold (차가운) : Observable] / [Hot (뜨거운) : Subject] 두 종류의 Obsevable 이 있습니다
         *
         * Observable / Subject 차이점 :
         *
         *   - [구독자 등록 기준] : [Observable] : 적어도 한 명의 관찰자가 있을 때 코드가 실행 (구독하기 전까지 데이터를 방출하지 않음)
         *
         *   - [구독자 수 기준] : [Observable] : 유니캐스트 (1:1 전송) 방식으로 옵저버 하나만을 구독 (subscribe) 할 수 있음
         *
         *   - [코드 실행 기준] : [Observable] : Observable 은 단지 하나의 함수이기 때문에 어떤 상태도 가지지 않으므로 모든 새로운 옵저버에 대해 관찰 가능한 create 코드를 반복해서 실행 (주요 버그와 비효율이 발생)
         *
         *   - [구독자 등록 기준] : [Subject] : 관찰자가 없더라도 코드가 실행되고 데이터가 발행 됨 (구독자의 존재 여부 관계없이 데이터 발행)
         *
         *   - [구독자 수 기준] : [Subject] : 멀티캐스트 (1:N 전송) 방식으로 여러개 옵저버를 구독 (subscribe) 할 수 있음
         *
         *   - [코드 실행 기준] : [Subject] : Subject 는 관찰자 세부 정보를 저장하고 코드를 한 번만 실행해 모든 관찰자에게 결과를 제공함
         * // -----------------------------------------
         * */
 

[소스 코드]

        // [로직 처리 실시]
        try {

            /**
             * // -----------------------------------------
             * [코드 설명]
             * // -----------------------------------------
             * 1. create() : 프로그래머가 직접 onNext, onComplete, onError를 호출해야함 (just 와의 차이점)
             * // -----------------------------------------
             * 2. Disposable isDisposed : 구독 연결 관계 확인 (true / false)
             * // -----------------------------------------
             * 3. Disposable dispose : 구독 연결 관계 끊기 (onComplete 이벤트가 정상 실행 시 별도로 호출할 필요 없음)
             * // -----------------------------------------
             * */


            // [Observable create 사용해 생성 실시 : 생성자]
            var observable: Observable<String> = Observable.create { subscriber: ObservableEmitter<String> ->
                try {
                    if (subscriber.isDisposed == false) { // [연결된 구독자가 있는 경우]
                        Log.i("---","---")
                        Log.d("//===========//","================================================")
                        Log.i("","\n"+"[A_Test >> main() :: subscriber() : 데이터 생성 -> onNext() 알림 전달]")
                        Log.d("//===========//","================================================")
                        Log.i("---","---")

                        // [onNext] 데이터 알림 전달
                        subscriber.onNext("TWOK")

                        // [onCompleted] 완료 알림 전달
                        subscriber.onComplete()
                    }
                } catch (e: Exception) {
                    e.printStackTrace()

                    // [onError] 에러 알림 전달
                    subscriber.onError(e)
                }
            }


            // [Observer 옵저버 는 Observable 생성자 를 구독 (Subscribe) 해 데이터를 소비]
            val disposable = observable.subscribe(
                { value ->
                    Log.i("---","---")
                    Log.d("//===========//","================================================")
                    Log.i("","\n"+"[A_Test >> main() :: onNext()]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[value :: "+value+"]")
                    Log.d("//===========//","================================================")
                    Log.i("---","---")
                },
                { error ->
                    Log.i("---","---")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[A_Test >> main() :: onError()]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+error.message+"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---")
                }
            )
            {
                Log.i("---","---")
                Log.w("//===========//","================================================")
                Log.i("","\n"+"[A_Test >> main() :: onComplete()]")
                Log.w("//===========//","================================================")
                Log.i("---","---")
            }


            // [로그 출력]
            //*
            Log.i("---","---")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[A_Test >> main() :: disposable]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[연결 해제 여부 :: "+disposable.isDisposed().toString()+"]")
            Log.d("//===========//","================================================")
            Log.i("---","---")
            // */

        }
        catch (e: Exception) {
            e.printStackTrace()
        }
 

[결과 출력]

 

 

반응형
Comments