오늘은 Jetpack Compose 의 Side effect 중 하나인,
DisposableEffect 에 대해서 정리해 보도록 하겠습니다.
참고로, SideEffect 에 대해서는 아래 글을 참조해 주세요.
>> LaunchedEffect , Side Effect 그리고 rememberCoroutine 총정리
1. DisposableEffect
1-1. DisposableEffect
Disposable 은 일회용처럼 사용하고 버릴 수 있는 물건을 가르키는데요.
Composable 에서 DisposableEffect 는, 아래의 경우에 실행이 됩니다.
아래에서 key값은 DisposableEffect에 인자로 들어가는 key값을 말합니다.
- Composable 이 Composition에서 제거되는 경우(Composable 화면에서 벗어나는 것)
- DisposableEffect의 key 값이 변화되는 경우
광고
좀 더 구체적으로 다음과 같은 경우에 DisposableEffect 가 필요하다고 할 수 있는데요.
- 회수되어야 하는 자원이 있는 경우
- listener 들을 unregister 해 주어야 하는 경우
- 통신 중 connect 를 끊어야 하는 경우(소켓통신 등)
- 화면종료전 로그를 남겨야 하는 경우
위와 같은 경우들은, close 되기 전에 실행되어야 하는데요.
이러한 코드를 실행해 줄 수 있는 곳이 바로 DisposableEffect 입니다.
극단적으로 단순화해서 ,
화면종료 전 처리해야 할 것들을 하는 곳 입니다.
1-1. onDispose
DisposableEffect 에서의 핵심 API가 바로 onDispose 입니다.
사실 이 onDispose 를 실행하기 위해서,
DisposableEffect 도 존재한다고 할 수 있는데요.
여기서 자원을 release 하거나, cancel() 하거나,
리스너를 unregister 해 주면 됩니다.
아래에서는 network request 를 실행한 뒤에,
onDispose 에서 cancel()을 해 주었습니다.
...
DisposableEffect(Unit) {
val request = doSomeNetworkRequest() // 네트워크 리퀘스트 실행
onDispose {
request.cancel()
}
}
...
광고
다른 예도 한번 더 보겠습니다.
이번에는 Timer 객체를 이용해서 사용하다가,
종료되는 시점에는 cancel()로 리소스를 회수하도록 해 주었습니다.
위 코드와 다른점은 DisposableEffect 에서 key 값을 받고 있다는 것 인데요.
만약, duration 값이 변경되면,
key 값이 변경된 것이므로, onDispose도 호출되게 됩니다.
@Composable
fun TestExample(timerDuration: Long) {
DisposableEffect(duration) {
val timer = Timer().apply {
schedule(duration) {
println("Timer 종료")
}
}
onDispose {
timer.cancel()
}
}
...
}
광고
1-2. 구 onDestroy
Activity 단위로 UI를 구성하던 시절에는,
onStop 이나 onDestory 등, lifecycle을 이용해서 정리되어야 할 리소스들을 정리해 주었는데요.
Compose 에서는 DisposableEffect 의 onDispose 가 그 역할을 대신한다고 할 수 있습니다.
물론, trigger 되는 경우의 수나, 여러가지 면에서 onDestroy 와 직접적으로 대응된다고 할 수는 없을 것 같지만,
리소스정리라는 측면에서만 보면, 그 동안, onDestory 가 하던 역할과 대응된다고 할 수 있을 것 같습니다.
2. 팁 및 주의할 점
2-1. key 값이 변화한다는 것의 의미
위에서 Disposable Effect 가 실행되는 시점은 다음 2가지라고 하였습니다.
- Composable 이 Composition에서 제거되는 경우
- DisposableEffect의 key 값이 변하는 경우
여기서 DisposableEffect 에 들어가는 인자인,
key 값이 변한다는 것이, 반드시 Recompose 를 의미하는 것은 아닙니다.
Recompose 가 되기 위해서는, 연결된 state 값이 변화가 있어야 합니다.
key 값과 composable 의 state 값이 연결되어 있다면,
Recompose 가 되겠지만, 그렇지 않다면,
UI는 Recompose 되지 않고, DisposableEffect 의 onDispose 만 일어나게 됩니다.
'Android Jetpack Compose > Jetpack Compose' 카테고리의 다른 글
LaunchedEffect , Side Effect 그리고 rememberCoroutine 정리 (0) | 2023.05.12 |
---|---|
BackHandler 에 대한 정리 # 유저가 Back 버튼 누를 때 Jetpack Compose (1) | 2023.05.11 |
Row 와 Column 의 Arrangement 와 Space # Jetpack Compose (0) | 2023.05.02 |
Android Default Font 지정하는 방법 정리 # Theme Jetpack Compose (0) | 2023.04.30 |
IconButton Ripple Effect 구현 # Jetpack Compose (0) | 2023.04.28 |
TopAppBar 공유하는 방법 정리 # Jetpack Compose (0) | 2023.04.25 |
mutableStateOf 와 MutableStateFlow 비교 총정리 # collectAsState (1) | 2023.04.23 |
Paging Library 구현 방법 총정리 # Android (1) | 2023.04.17 |
collectAsState 로 Flow 타입 데이터 받기 구현 방법 # Jetpack Compose (0) | 2023.04.10 |
Jetpack Compose 화면 하단에 배치하기 (0) | 2023.03.22 |
댓글