본문 바로가기
Android Jetpack Compose/Jetpack Compose

DisposableEffect 에서 화면종료 전 리소스 정리 구현 # 구 onDestroy jetpack Compose

by Developer88 2023. 5. 13.
반응형

오늘은 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 만 일어나게 됩니다.

 

728x90

댓글