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와 관련되게 장단점, 사용법 간단한 예시를 한번 배워보았다. !!!

'개발 > Java' 카테고리의 다른 글
Java_ 지역변수 , 인스턴스 변수 차이 (0) | 2024.09.12 |
---|---|
Java & Swift _ runOnUiThread , view.post , handler, DispatchQueue.... 의 차이 (0) | 2024.09.12 |
Java_ Rxjava blockingGet , subscribe ... (0) | 2024.08.25 |
Java_ Lazy Singleton (0) | 2024.08.25 |
AOS_ HashMap 과 TreeMap 의 차이 (0) | 2024.03.04 |