[Android] CompositeDisposable , Disposable

2021. 10. 15. 13:47모바일/Android_Java

Disposable

Observable source = Observable.just("D", "E", "F");
Disposable disposable = source.subscribe(System.out::println);

//D
//E
//F

위 코드는 Observable이 발행하는 아이템의 갯수가 정해져있어서 발행이 끝나면 onComplete()가 호출되고 종료될 것이다.
그러나, 아이템 발행이 무한하거나 오래동안 실행될때 Observable을 종료시켜주지 않으면 메모리 누수가 발생할 수 있다.

만약, Disposable이 여러개라면 각 객체마다 dispose를 해줘야 하므로 반복적인 작업을 해야만한다.

CompositeDisposable

        Observable<Long> observable = Observable.interval(0,1, TimeUnit.SECONDS);
        Disposable disposable1 = observable.subscribe(System.out::println);
        Disposable disposable2 = observable.subscribe(System.out::println);
        Disposable disposable3 = observable.subscribe(System.out::println);
        CompositeDisposable compositeDisposable = new CompositeDisposable();
        compositeDisposable.addAll(disposable1,disposable2,disposable3);



        new Thread(()->{
            try {
                compositeDisposable.dispose();
                Thread.sleep(3500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }



        }).start();

0
0
0
  • 초기 initialDelay 가 0이므로 0만 출력이 되고 나저미는 dispose ()되어 출력되지 않는다.

Interval

  • 일정 시간 간격으로 데이터흐름을 생성한다.
  • 주어진 시간 간격으로 0부터 1씩 증가하는 Long객체를 발행합니다.
    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.COMPUTATION)
    public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit) {
        return interval(initialDelay, period, unit, Schedulers.computation());
    }

initialDelay

  • 최초 데이터 발행 딜레이 시간

period

  • 뒤쪽 데이터들의 발행 간격

unit

  • initialDay 와 period숫자의 의미!!
  • 1이고 SECONDS. 면 1은 1초를 뜻함
        Observable<Long> observable = Observable.interval(0,1, TimeUnit.SECONDS);
        Disposable disposable1 = observable.subscribe(System.out::println);

        new Thread(()->{
            try {
                Thread.sleep(3500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

0
1
2
3