본문 바로가기
개발/Java

AOS - Rxjava3 , Single , Disposable

by JunsC 2024. 6. 23.
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 건드리는 부분은 보통 메인 스레드에서 담당하고 있기 때문이다 

 

 

 

그렇다면 Single / Disposable / Flowable 에 대해 한번 알보도록 하자

 

1. Single

  • 정의: Single은 정확히 하나의 아이템이나 에러를 내보내는 타입이야. 주로 비동기 작업에서 단일 결과를 받을 때 사용해.
  • 사용 예시: 데이터베이스에서 정보 가져오거나 네트워크 요청할 때 유용해.
  • 특징:
    • 하나의 값 또는 에러만 내보내.
    • 값을 내보낸 후에는 끝나.
    • 에러가 발생하면 즉시 종료하고 에러 알림을 보내.

예시:

val single: Single<String> = Single.create { emitter ->
    val result = "안녕, 세상!"
    emitter.onSuccess(result) // 결과 내보내기
    // emitter.onError(Throwable("오류 발생")) // 필요하면 에러 내보내기
}

// Single 구독하기
single.subscribe(
    { value -> println("받은 값: $value") }, // onSuccess
    { error -> println("에러: ${error.message}") } // onError
)

 

장점

  • 단일 결과: 정확히 하나의 결과를 처리하기 때문에, 결과가 항상 명확해.
  • 간단한 에러 처리: 에러가 발생할 경우, onError를 통해 간단하게 처리할 수 있어.
  • 직관적 사용: API 호출이나 데이터베이스 쿼리 같은 간단한 비동기 작업에 적합해.

단점

  • 여러 값 처리 불가: 하나의 값만 처리할 수 있어서, 다수의 값이 필요한 경우에는 적합하지 않아.
  • 사용 패턴 제한: 비동기 처리 방식이 단순해 복잡한 로직을 구현하기 어려울 수 있어.

사용 팁

  • API 호출, 단일 데이터 요청 등 결과가 하나인 경우에 사용해.

 


 

2. Disposable

  • 정의: Disposable은 해제할 수 있는 리소스를 나타내는 타입이야. 리액티브 스트림을 사용할 때 구독의 생명주기를 관리하는 데 필요해.
  • 사용 예시: 안드로이드 앱에서 액티비티나 프래그먼트가 파괴될 때 구독을 정리할 때 사용해.
  • 특징:
    • dispose()를 호출해서 스트림에서 구독을 해제할 수 있어.
    • 메모리 관리와 옵저버의 생명주기를 관리하는 데 도움을 줘.

예시:

val disposable: Disposable = single.subscribe(
    { value -> println("받은 값: $value") }, // onSuccess
    { error -> println("에러: ${error.message}") } // onError
)

// 더 이상 필요 없을 때 해제하기 (예: onDestroy에서)
disposable.dispose()

 

 

장점

  • 리소스 관리: 구독을 해제하여 메모리 누수를 방지할 수 있어.
  • 라이프사이클 관리: 액티비티나 프래그먼트의 생명주기와 연동해 쉽게 관리할 수 있어.

단점

  • 구독 해제 누락: 해제를 잊으면 메모리 누수가 발생할 수 있어.
  • 복잡성 증가: 매번 구독할 때마다 해제하는 코드를 추가해야 하므로 코드가 복잡해질 수 있어.

사용 팁

  • 액티비티나 프래그먼트의 onDestroy()에서 dispose()를 호출해 항상 구독을 해제해.
  • 작업이 끝났을 때 반드시 해제하는 습관을 들이면 좋겠어.

 


 

 

3. Flowable

  • 정의: Flowable은 시간에 따라 여러 아이템을 내보낼 수 있는 타입이야. 비동기 스트림에서 여러 값을 처리할 때 유용해.
  • 사용 예시: 대량의 데이터를 처리하거나 이벤트 스트림을 사용할 때 적합해.
  • 특징:
    • 여러 값을 내보낼 수 있고, 요청에 따라 값을 조절할 수 있어.
    • 백프레셔(backpressure)를 지원해서 소비자와 생산자의 데이터 속도를 조절할 수 있어.

예시:

val flowable: Flowable<Int> = Flowable.range(1, 5)

flowable.subscribe { value -> println("받은 값: $value") }

 

 

 

장점

  • 다중 값 처리: 여러 값을 비동기적으로 처리할 수 있어, 이벤트 스트림에 적합해.
  • 백프레셔 지원: 소비자가 처리할 수 있는 속도에 맞춰 데이터를 조절할 수 있어.

단점

  • 복잡성 증가: 여러 값과 백프레셔 처리로 인해 코드가 복잡해질 수 있어.
  • 메모리 사용량 증가: 다량의 데이터를 처리할 때 메모리 사용이 늘어날 수 있어.

사용 팁

  • 실시간 데이터 스트리밍, UI 이벤트 처리 등 여러 이벤트가 발생하는 경우에 사용해.
  • 백프레셔 전략을 잘 정의해 소비자의 처리 능력에 맞춰 데이터 전송을 조절해.

 


 

결론

  • Single: 단일 결과가 필요한 경우에 간단하고 명확하게 사용할 수 있어. API 호출이나 단일 데이터 요청에 적합.
  • Disposable: 메모리 관리와 리소스 해제에 필수적. 사용 후 반드시 해제하는 습관이 필요해.
  • Flowable: 다수의 데이터를 처리해야 할 때 유용하고, 실시간 데이터 흐름에 적합. 백프레셔 관리로 안정적인 처리가 가능해.

 

 

총 Rxjava와 관련되게 장단점, 사용법 간단한 예시를 한번 배워보았다. !!!

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."