반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • Java
    • kotlin
    • xcode
    • level1
    • Android
    • reduce
    • swfit
    • map
    • swift
    • 타입
    • 공부
    • 구축
    • 개발
    • 코딩테스트
    • ios
    • IT
    • 프로그래머스
    • 예제
    • 프로그래밍
    • JSP

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    RxJAVA - Subject 간단 정리
    Language/JAVA

    RxJAVA - Subject 간단 정리

    2021. 10. 17. 19:52
    반응형

    * 개인공부를 하며 정리한 내용이므로, 부정확하거나 사실과는 다른 내용이 있을수도 있습니다.

      해당사항에 대해 의견을 주시면 겸허히 수정하도록 하겠습니다.


    Observable과 Observer

     Observable을 Observer가 받아서 '반응'합니다.

    Observable을 단독으로 쓰진 않고, Observer이자 Observable인 subject를 주로 사용합니다.

     

    Cold / Hot Observer

    Hot : 생성하자마자 바로 흘려보냄

    • 구독자의 존재여부 상관 x
    • 구독자를 선택적으로 고려 가능
    • 구독 시점으로부터 발행하는 값을 받는게 기본
    • 마우스, 키보드, 시스템 이벤트 등의 주로 사용 (멀티캐스팅도 포함)

    Cold : 요청하고 결과를 받아옴.

    • 일반적인 옵저버
    • 구독하지 않다면, 데이터를 흘리지도 않음.
    • 요청시에만 값을 받는다.

     

     

    Subject

    Onservable와 Subject 구조 파해치기 https://sujinnaljin.medium.com/rxswift-subject-99b401e5d2e5

     

     

     

     

    publishSubject

     초기값이 없으며, 구독 이후 배출한 항목들만 옵저버에게 발행한다.

    단, 생성시점과 구독시점의 차이가 있다면, 그 차이기간동안의 발행된 항목은 받지 못할 수 있다.

    따라서, 만약 값을 모두 받아야 한다면 Create를 명시적으로 사용해 명시적으로 cold observable을 사용하거나, ReplaySubject를 사용해야 한다

     

     

    AsyncSubject

    동작이 완료된 후에 동작하며, 마지막 값만 출력한다.

     

     

    BehaviorSubject

    초기값이 존재하는 Observable이다. 구독 이후 값을 발행하며, 이후 발행된 항목을 계속 발행한다.

     

     

     

     

    RePlaySubject

    구독시점과 관계없이 Observable이 발행한 모든 항목을 발행해준다.

    단, 버퍼의 크기가 매우 커지거나, 첫 발행이후 시간이 오래 경과한다면 항목들을 잃을 수 있다.

    멀티스레드 환경에서 이는 모호함ㅇ과 observavle 계약 위반을 유발할수있기 때문에, on 또는 onNext와 같이 비순차적인 호출을 유발시키는 메를 사용하지 않아야 한다.

    • observable Contract : http://reactivex.io/documentation/ko/contract.html

     


    Example

     

    //CallManager.java
    public static BehaviorSubject<Integer> state = BehaviorSubject.create();
    
    //IncallService에 대한 변경사항을 알리는 콜백을 정의
        private Object callback = new Call.Callback(){
            @Override
            public void onStateChanged(Call call, int newState) {
                super.onStateChanged(call, newState);
                //데이터의발행을 알림
                state.onNext(newState);
            }
        };

    통화 상태에 대한 정보(callback)이 변경될때마다 state를 현재 값으로 갱신합니다.

     

     

    //CallAcitivity.java
    
    @Override
        protected void onStart() {
            super.onStart();
    //        assert updateUi(-1) != null;
            disposable.add(
                    CallManager.state
                            //onNext 이벤트 처리 (발행에 대한 처리)
                            .subscribe(new Consumer<Integer>() {
                                @Override
                                public void accept(Integer integer) throws Throwable {
                                    updateUi(integer);
                                }
                            }));
    
    
            disposable.add(
                    CallManager.state
                            .filter(new Predicate<Integer>() {
                                @Override
                                public boolean test(Integer integer) throws Exception {
                                    return integer == Call.STATE_DISCONNECTED;
                                }
                            })
                            .delay(1, TimeUnit.SECONDS)
                            .firstElement()
                            .subscribe(new Consumer<Integer>() {
                                @Override
                                public void accept(Integer integer)throws Throwable{
                                    finish();
                                }
                            }));
        }

    disposable을 이용해 state를 구독받아 알맞은 작업을 처리하는 코드입니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    반응형
    저작자표시 비영리 (새창열림)

    'Language > JAVA' 카테고리의 다른 글

    Oracle JDK Archive Link  (0) 2021.12.01
    RxJAVA - CompositeDisposable 간단 정리  (0) 2021.10.17
    JSON 데이터로 JAVA 클래스파일 생성하기 feat.retrofit2  (0) 2021.06.23
    java swing 효율 최대로! widowBuilder  (0) 2021.05.28
    Swing으로 커스텀 리스트 뷰 만들기  (0) 2021.05.28
      'Language/JAVA' 카테고리의 다른 글
      • Oracle JDK Archive Link
      • RxJAVA - CompositeDisposable 간단 정리
      • JSON 데이터로 JAVA 클래스파일 생성하기 feat.retrofit2
      • java swing 효율 최대로! widowBuilder
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바