Notice
Recent Posts
Recent Comments
Link
투케이2K
289. (RxJava) [Observable] interval 사용해 주기적 반복 데이터 발행 및 subscribe 구독 결과 메시지 확인 본문
Java
289. (RxJava) [Observable] interval 사용해 주기적 반복 데이터 발행 및 subscribe 구독 결과 메시지 확인
투케이2K 2022. 12. 30. 19:09[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : RxJava
[설 명]
/**
* // -----------------------------------------
* [요약 설명]
* // -----------------------------------------
* 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 는 관찰자 세부 정보를 저장하고 코드를 한 번만 실행해 모든 관찰자에게 결과를 제공함
* // -----------------------------------------
* */
[소스 코드]
public class A_Test {
// [전역 변수 설정]
static Disposable disposable = null;
// [메인 함수 정의]
public static void main() {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: 테스트 함수 동작 실시]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [로직 처리 실시]
try {
/**
* // -----------------------------------------
* [코드 설명]
* // -----------------------------------------
* 1. interval() : 특정 시간 간격 반복 작업을 수행 합니다 (사용하지 않을 시 dispose 사용해 연결 끊기 필요)
* // -----------------------------------------
* 2. subscribe() : 구독자 입니다 (Observable 데이터 발행 확인)
* // -----------------------------------------
* 3. Disposable isDisposed : 구독 연결 관계 확인 (true / false)
* // -----------------------------------------
* 4. Disposable dispose : 구독 연결 관계 끊기
* // -----------------------------------------
* */
// [Observable 생성]
Observable <Long> observable = Observable.interval(1, TimeUnit.SECONDS);
// [구독 (Subscribe) 해 데이터를 소비]
disposable = observable.subscribe(
value -> {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: subscribe :: onNext()]");
Log.i("","\n"+"-----------------------------------------");
Log.i("","\n"+"[value :: "+String.valueOf(value + 1)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [카운트 값이 10 이상이고 구독이 연결된 상태인 경우]
if ((value + 1) >= 3 && disposable != null && disposable.isDisposed() == false){
// [연결 끊기]
disposable.dispose();
// [로그 출력]
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: subscribe :: dispose()]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
},
error -> {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: subscribe :: onError()]");
Log.e("//===========//","================================================");
Log.i("---","---");
},
() -> {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: subscribe :: onComplete()]");
Log.w("//===========//","================================================");
Log.i("---","---");
});
}
catch (Exception e) {
e.printStackTrace();
}
}
} // TODO [클래스 종료]
[결과 출력]
D///===========//: ================================================
I/: [A_Test >> main() :: 테스트 함수 동작 실시]
D///===========//: ================================================
D///===========//: ================================================
I/: [A_Test >> main() :: subscribe :: onNext()]
I/: -----------------------------------------
I/: [value :: 1]
D///===========//: ================================================
D///===========//: ================================================
I/: [A_Test >> main() :: subscribe :: onNext()]
I/: -----------------------------------------
I/: [value :: 2]
D///===========//: ================================================
D///===========//: ================================================
I/: [A_Test >> main() :: subscribe :: onNext()]
I/: -----------------------------------------
I/: [value :: 3]
D///===========//: ================================================
W///===========//: ================================================
I/: [A_Test >> main() :: subscribe :: dispose()]
W///===========//: ================================================
반응형
'Java' 카테고리의 다른 글
Comments