코딩하는 개굴이

[안드로이드] LifecycleScope 란? (+ LifecycleObserver) 본문

안드로이드

[안드로이드] LifecycleScope 란? (+ LifecycleObserver)

개굴이모자 2022. 12. 19. 00:28
반응형

왜 갑자기 Lifecycle Scope 를 보러 왔는데 초장이 Lifecycle aware Copmonent 인가? 라고 생각할 수 있다.
그러나, Lifecycle Scope를 이해하기 위해서는 우선 Lifecycle aware Component 를 알아야한다.

그럼 순차적으로 진행 해보도록 하자.

 

 

Lifecycle aware copmonent

Lifecycle aware component 란, 다른 컴포넌트의 lifecycle 이 변경될 때 이에 대응하는 라이브러리로, component 가 lifecycleowner의 상태 변화를 observe 하여 필요한 작업을 스스로 하는 기능을 수행한다.

생명주기 메소드에 데이터를 불러오거나 리소스를 의존하는 방식은 프로그램의 규모가 커지면 오동작할 가능성이 생기게 된다. 따라서, 생명주기에 의존적이었던 코드들을 제거하고 lifecycle-aware 컴포넌트에 이런 처리들을 위임하여 유지보수성을 높일 필요성이 생긴 것이다.

component 가 lifecycle 에 따른 작업을 진행하도록 하며, 이런 component 들을 lifecycle aware 하다고 한다.

  • androidx.appcomapt:appcompat을 이미 사용하고 있다면 Lifecycle-aware 컴포넌트들이 포함되어 있으므로 별도의 작업이 필요없다.
  • androidx.lifecycle 패키지는 activity나 fragment의 생명 주기 상태에 따라 자동으로 동작을 제어할 수 있는 클래스와 인터페이스를 제공한다.

 

LifecycleScope

자, 이제 본론이다!

이런 LifecycleComponent 를 사용한다면, 생명주기를 인식하는 코루틴 즉, lifecycleScope를 만들 수 있다.

LifecycleOwner로써 취급되는 AppCompatActivity 혹은 Fragment를 일반적으로 사용 시, lifecycle 컴포넌트를 사용하게 되는데, 이때 lifecycleScope 를 사용할 수 있다.

lifecycleScope.launch {
	//.....
}

위에서 보이듯이 일반적인 coroutine scope 와 같이 launch 혹은 async 등과 같은 함수 호출로 suspend 작업을 할 수 있다.

 

그러나 일반적인 coroutine scope 의 경우 LifecycleOwner(Activity/Fragment) 가 Destroy 시, 실행중이었던 코루틴을 취소하기 위해서는 명시적으로 CoroutineContext.cancel()을 호출해주어야한다.

 

그와 달리, lifecycleScope 에서 실행하는 코루틴은 생명주기에 맞게 알아서 하위 코루틴 작업들을 취소하므로 안전하게 종료된다.

그 외에도, 생명주기에 맞게 코루틴을 시작/중단/재개/재시작 등을 할 수도 있다.

 

 

LifecycleObserver

추가로, 생명주기에 맞게 특정 동작을 제어하고 싶다면 위의 코루틴을 사용하는 방법도 있지만, LifecycleObserver를 사용할 수도 있다.

Lifecycle 객체에 Observer를 등록해두면 생명주기의 변화 시, lifecycle 객체가 등록된 observer 를 실행하게 되는 방식이다.

 

LifecycleOwner 는 내부에 Lifecycle 을 가지고 있다. Lifecycle 은 액티비티의 상태를 저장하고 옵저버들에게 상태 변화를 알려준다.

Lifecycle 의 상태를 알고 싶다면, LifecycleObserver 를 생성하고 Lifecycle 에 등록하면 된다.

class LifeCycleActivity : AppCompatActivity() {

    private var observer = MyObserver(lifecycle)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lifecycle)

        lifecycle.addObserver(observer)
    }
}

MyObserver 에서 @OnLifecycleEvent 태그를 건 함수들이 해당 시점에 호출될 것이다.

 

 

참고 링크

반응형
Comments