Android/Android Compose

Jetpack Compose 에서 Lifecycle 관리하기

최데브 2023. 5. 11. 22:35

컴포즈를 사용하면 기존 Lifecycle 을 이용할때랑 같은 방식으로 작동하지가 않는다.

조금 다른 방식을 사용해야하는데 컴포즈에서 말하는 부수효과에 대한 이해가 필요하다.

 

https://developer.android.com/jetpack/compose/side-effects?hl=ko 

 

Compose의 부수 효과  |  Jetpack Compose  |  Android Developers

Compose의 부수 효과 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 부수 효과는 구성 가능한 함수의 범위 밖에서 발생하는 앱 상태에 관한 변경사항입니다.

developer.android.com

위 링크에 DisposableEffect 에 대해 예시를 들때 아래 코드와 비슷한 예제가 나온다.

여기서도 lifecycle 관리하는 방법으로 예시를 들어놨는데 참고하면 좋을 듯 하다.

@Composable
private fun DisposableEffectWithLifeCycle(
    onResume: () -> Unit
) {
    val context = LocalContext.current
    //생명주기 상태 변경을 관찰하는 콜백 인터페이스
    val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
	// rememberUpdatedState 는 상위 컴포저블의 데이터가 바뀔때 하위 컴포저블의 remember 된
    //데이터도 바뀌어야할때 사용
    val currentOnResume by rememberUpdatedState(onResume)

    //Composable 의 lifecycle 에 맞춰 정리해야하는 리스너나 작업이 있는경우에
    //리스너나 작업을 제거하기 위해 사용되는 Effect 가 DisposableEffect
    //부수효과 처리중 재시작되거나 컴포즈가 화면에서 사라지는경우 리소스 해제가 필요할때
    //사용한다
    //즉 lifecycleOwner 가 변경시 기존 콜백을 remove하고 재시작한다.
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_RESUME -> {
                    currentOnResume()
                }
                else -> {}
            }
        }

        lifecycleOwner.lifecycle.addObserver(observer)
        //DisposableEffect 는 onDispose 를코드 블록의 최종문장으로 포함해야함
        //포함하지 않으면 에러 발생
        //부수효과를 
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
            Toast.makeText(
                context,
                "사라짐",
                Toast.LENGTH_SHORT
            )
                .show()
        }
    }
}

 

위처럼 만들고 부르는곳은

    DisposableEffectWithLifeCycle(
        onResume = {
           // 부르고 싶은 것
        }
    )

이렇게 사용하면 된다~

반응형