Java

AOS - Rxjava3 , Single , Disposable

JunsC 2024. 6. 23. 16:46
728x90

Single , Dispoasable 등 rxjava 비동기 관리 코드 정리하는 중 꼭 disposable 을 해야하는지 의문이였다..

자동으로 코드 완료 후 메모리 해제되는게 아닌가 싶었는데 

Flowable 은 아니더라.. 

 

Disposable d = Flowable.. 
d.dispose();

 

이렇게 처리를 해줘야 한다 다 사용했으면...

 

그래서 뭔가 비효율적이라 생각했고 Single 을 기준으로 기능이나 성능 등 정의를 확인해보니 알아서 메

모리 해제 해준다고 한다.

 

Single<Boolean> deletePerson = ApisCall.deletePerson(m_Id);
    deletePerson.subscribeOn(Schedulers.io())
            .observeOn(Schedulers.single())
            .subscribe(new DisposableSingleObserver<>() {
                @Override
                public void onSuccess(@NonNull Boolean aBoolean) {
                    Util.log("ApisCall", "[deletePerson success]");
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Util.logError("ApisCall", "[deletePerson Error]", e);

                }
            });
} catch (Exception e) {
    Util.logError(Util.UtilTAG, "[ApisCall.deletePerson(m_Id) Error]", e);
}

 

그래서 이렇게 해놓으면 io 백그라운드에서 single 스레드로 결과를 알려주고 알아서 메모리 해제 후 다시 또 재생할 수 있게 되었다.

 

원래는 

Disposable d = null;

if(d != null || !d.isDispose()) d.dispose()

d = ...
이렇게 코드를 해놧는데 

 

위의 코드처럼 하니 더욱 간결해졌다.

 

--------중요!!!!!!!!!!-------

 

그리고 observOn에 중요한게 하나 있는데 

 

subscribe 쪽에 UI를 건드리는 일부분이라도 있으면 single() 로 하면 에러가 난다

반드시 그땐 AndroidSchedulers.mainThread() 로 결과를 넘겨주어야 에러가 안난다

왜냐하면 UI 건드리는 부분은 보통 메인 스레드에서 담당하고 있기 때문이다