이번 글에서 알아 볼 기능은 DisposableEffect 이다.
첫 Composition 이 완료된 후 내부 Scope 를 실행하며, Composition leave 시에 맞춰 종료 Lambda 를 제공해주는 Effect.
key 를 제공하기에 key 의 변화에 따라 내부 Scope 가 재실행되며, CoroutineScope 가 아니기에 따로 CoroutineScope 를 만들지 않는 이상, 내부에서 Suspend Function 을 호출할 수 없다.
다른 Effect 들과 마찬가지로 NonRestartableComposable 로 구현되어있어 Composable 이 재시작하지 않는다.
class MainActivity() : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
DisposableEffect(true) {
Timber.d("컴포지션 완료 후 실행시킬 코드를 이곳에 작성해주세요")
onDispose { Timber.d("컴포지션이 종료될 때 실행시킬 코드를 이곳에 작성해주세요") }
}
}
}
}
주로 Composable 생명 주기에 맞춰 특정 객체에 대한 참조를 해제하여 메모리 누수가 발생하지 않게 할 때 사용한다.
@Composable
fun MyComposableWithLifecycleObserver() {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_START -> Timber.d("Lifecycle: ON_START")
Lifecycle.Event.ON_RESUME -> Timber.d("Lifecycle: ON_RESUME")
Lifecycle.Event.ON_PAUSE -> Timber.d("Lifecycle: ON_PAUSE")
Lifecycle.Event.ON_STOP -> Timber.d("Lifecycle: ON_STOP")
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
// 이것이 없으면 심각한 메모리 누수가 발생
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}