본문 바로가기
ANDROID/Android Jetpack

[Android/Jetpack] AAC - Lifecycles

by 주 녕 2021. 7. 20.
728x90

https://developer.android.com/

 

이 포스팅에 앞서 MVVM 아키텍처와 AAC에 대해 알아보았다. 이제는 AAC의 5가지 라이브러리를 Android developer 문서를 통해 알아볼 예정이다. Lifecycles에 대한 내용이 잘 이해가 되지 않는다면 MVVM이 어떤 것인지 먼저 알아보는 것이 좋을 것 같다!

 

[Android/Jetpack] MVVM 아키텍처와 AAC

이전에 다뤘던 안드로이드 아키텍처 가이드의 곳곳에 등장했던 안드로이드 아키텍처 컴포넌트(Android Architecture Component)를 사용하면 자연스럽게 MVVM 아키텍처를 사용하게 된다고 한다. 이번 포

junyoung-developer.tistory.com

 

Lifecycles

생명주기 모니터링을 돕는 라이브러리

androidx.lifecycle 패키지는 수명 주기 인식 구성요소(Activity나 Fragment의 현재 수명 주기 상태를 기반으로 동작을 자동 조정할 수 있는 구성요소)를 빌드할 수 있는 클래스 및 인터페이스를 제공합니다.

  • Lifecycle : Lifecycle을 나타내는 객체
  • Lifecycle Owner : Life 객체에 activity, fragment의 상태를 제공
  • Lifecycle Observer : 상태 변화에 대한 이벤트를 받음

 

Lifecycles 클래스

Activity나 Fragment와 같은 컴포넌트의 수명 주기 상태 관련 정보를 포함하여 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스Event와 State, 이 2개의 메인 Enumerations을 사용하여 수명 주기 상태를 추적함

  • Event : 프레임워크 및 Lifecycle 클래스에서 전달되는 수명 주기 이벤트. Activity와 Fragment의 콜백 이벤트에 매핑됨.
  • State : Lifecycle 객체가 추적한 컴포넌트의 현재 상태

State는 아래 그래프의 노드, Event는 노드 사이의 간선

 

https://developer.android.com/topic/libraries/architecture/lifecycle#kotlin

클래스는 메서드에 어노테이션을 추가함으로써 컴포넌트들의 수명주기 상태를 모니터링할 수 있다.

Lifecycle 클래스의 addObserver() 메서드를 호출하고 Observer 객체를 넘김으로써 observer를 추가할 수 있다.

class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        ...
    }
}

myLifecycleOwner.getLifecycle().addObserver(MyObserver())

 

LifecycleOwner 클래스

클래스에 Lifecycle이 있음을 나타내는 단일 메서드(=getLifecycle( )) 인터페이스

  • LifecycleOwner는 Fragment 및 AppCompatActity와 같은 개별 클래스에서 Lifecycle의 소유권을 추출하고, 함께 작동하는 컴포넌트를 작성할 수 있게 함
  • LifecyleObserver를 구현하는 구성요소들은 LifecycleOwner를 구현하는 컴포넌트와 원활하게 작동하는데, LifecycleObserver가 관찰을 위해 등록하는 Lifecycle를 LifecycleOwner가 제공할 수 있기 때문

 

Lifecycle-aware 컴포넌트의 권장사항

  • UI 컨트롤러(Activity와 Fragment)를 가능한 가볍게 유지할 것!자체 데이터를 확보하기 보단 ViewModel을 이용하여 데이터를 확보하고, LiveData 객체를 관찰하여 Viwe를 업데이트할 것
  • 데이터 기반 UI를 작성할 것!데이터 변경에 따라 View를 업데이트하거나 사용자 작업을 다시 ViewModel에 알리는 것은 UI 컨트롤러의 책임
  • ViewModel 클래스에 데이터 로직을 배치할 것!ViewModel은 UI 컨트롤러와 앱 나머지 부분의 커넥터 역할임. 하지만 데이터를 가져오는 것은 ViewModel의 책임이 아니다. 대신 ViewModel은 적절한 구성요소를 초훌하여 데이터를 가져오고 결과를 다시 UI 컨트롤러에 제공해야 함
  • Data binding을 사용하여 View와 UI 컨트롤러 사이의 인터페이스를 깔끔하게 유지할 것!
  • UI가 복잡하다면 UI 수정을 처리할 presenter 클래스를 만드는 것이 좋음 (MVP)
  • ViewModel에서 View나 Activity Context를 참조하지 말 것 (GC가 제대로 처리하지 못해 메모리 누수가 발생할 수 있음)
  • Kotlin Coroutine을 사용하여 장기 실행 작업 및 비동기적으로 실행될 수 있는 기타 작업을 관리할 것

 

Lifecycle-aware 컴포넌트의 사용 사례

  • 위치 기반 어플리케이션 : 대략적인 위치(coarse location)와 세분화된 위치(fine-grained location) 업데이트 간 전환. Lifecycle-aware 컴포넌트와 LiveData를 통해 사용자 위치가 변경될 때 자동으로 UI를 업데이트
  • Video 버퍼링 중지와 시작 : Lifecycle-aware 컴포넌트를 사용하면 Video 버퍼링을 최대한 빨리 시작하지만, 앱이 완전히 시작될 때까지 재생을 연기함. 또한 앱이 제거될 때 버퍼링을 종료할 수 있음
  • Network 연결 시작과 중지 : 앱이 forground에 있는 동안 네트워크 데이터를 실시간으로 업데이트할 수 있고, background로 이동하면 실시간 업데이트를 자동으로 중지할 수 있음
  • Animated drawable의 일지중지와 재시작 : 앱이 background에 있는 동안 중지처리하고, forground에 이동하고 재시작할 수 있음

 

 


reference>

728x90

댓글