ABOUT ME

-

  • Android) LiveData와 Lifecycle 알아보기 - Activity, Fragment 사용법
    Android 2021. 1. 5. 15:28

    개발을 하다보면 Activity와 Fragment를 함께 사용하면서 복잡한 생명주기를 다루게 되는 순간이 있습니다.

    이 때 생명주기에 더욱 주의를 기울여야 하는데, AAC의 Lifecycle이 생명주기의 처리를 도와주는 라이브러리입니다.

     

    LiveData

    • Observer Pattern을 쉽고 간단한 문법으로 구현 할 수 있게 해줍니다.
    • 주로 ViewModel에 생성하며 View가 observe 하는 형태로 사용합니다. 
    • LiveData는 lifecycle-aware component입니다.
    • 즉 LiveData의 lifecycle은 observer의 lifecycle을 따라갑니다. 그래서 observer가 위치한 View가 사라지게 되면 LiveData도 함께 사라집니다.

    ※ Observer Pattern 

    1. View가 Data Source에게 Data를 달라고 명시적으로 요청

    2. Data Source는 Data를 생산하고 View는 Data를 기다림

     

    위의 2가지 중 2번째 경우가 Observer Pattern을 의미합니다. Data를 생산하고 가지고 있는 주체인 Data Source와 Data의 변경을 감지하고

    사용해야하는 관찰자 객체 Observer가 존재하며 이 둘의 관계는 1:1 또는 1:N입니다.


    Lifecycle

    • Lifecycle : Lifecylce을 나타내는 객체입니다.

    • LifecycleOwner : Activity나 Fragment의 Lifecycle을 분리하여 담은 객체를 말하며, 
      Lifecycle 객체에 액티비티 상태를 제공해줍니다. 
      액티비티의 AppCompatActivity는 내부적으로 LifecycleOwner를 구현하고 있습니다. 
      그렇기 때문에 Activity는 lifecycle 객체를 직접 참조할 수 있습니다.

    • LifecycleObserver : Lifecycle로 부터 액티비티 상태변화에 대한 이벤트를 받습니다.

     

    Usage

    먼저 ViewModel에서 LiveData를 생성하였습니다. 언더바(_)로 선언된 변수는 backing property로 이전 글에서 참고부탁드립니다.

    class MainViewModel : ViewModel(){
      private val _data : MutableLiveData<String>()
      val data : LiveData<String>
        get() = _data
      
      _data.postValue("any string")
      //or
      _data.setValue("any string")
    }

    위 처럼 LiveData를 생성했으면, View로 가서 관찰을 시작합니다.

     

    Activity

    View에서 viewModel 객체의 data를 가져와서 observe 하는 방식으로 사용합니다.

    위의 코드를 보면 observe의 인자는 2개인데, LifecycleOwner(액티비티에서는 곧 자신이기 때문에 this로 전달)와 Observer이 있습니다.

     

    LifecycleOwner는 위의 설명처럼 해당화면의 생명주기를 관찰할 수 있는 것입니다.

    즉 LiveData는 LifecycleOwner를 통해 해당 View의 Lifecycle을 관찰하고 해당 View와 생명주기를 함께 할 수 있습니다.

    Observer는 해당 data를 가져와서 사용할 로직을 정의하는 interface 객체입니다. 어떻게 사용할지 정의해주시면 됩니다.

     

    Fragment

    프래그먼트에서는 위의 액티비티 처럼 LifecycleOwner에 this를 전달하여 사용하면 안됩니다.

     

    빨간줄과 상관없이 빌드는 되지만 화면을 돌리게 되면 앱이 죽게 됩니다.

    그 이유는 프래그먼트는 액티비티와 다르게 onDestroy()가 호출되지 않은 상태에서 onCreateView가 여러 번 호출 될 수 있기 때문입니다.

    즉 프래그먼트의 Lifecycle은 onDestroy()를 거치지 않은 상황에서 새로운 Observer가 등록되어, 여러개의 Observer가 호출되는 현상이 발생할 수 있습니다.

     

    프래그먼트는 2개의 Lifecycle이 존재하고 있습니다.

    • Fragment LifecycleFragment View Lifecycle입니다.

    Fragment는 Fragment View 보다 긴 생명주기를 가지고 있습니다.

    Fragment 그 자체와 Fragment에 포함되는 View들은 약간 다른 Lifecycle을 가진다고 볼 수 있습니다.

    그래서 화면 회전이 발생하면, onDestroy()를 거치지 않은 Fragment의 Lifecycle이 죽지 않은 상태로 

    onCreateView()에서 새로운 Observer들이 호출되어 중복되는 현상이 발생합니다.

     

    그래서 일반적으로 UI 업데이트 용도로는 Fragment View Lifecylcle이 적합합니다.

    이로써 Observer 중복 호출 문제도 해결 할 수 있습니다.

     

    Fragment

    이미 Fragment 1.2.0부터 viewLifecycleOwner를 사용하도록 권장하고 있습니다.

     

    프래그먼트에서 LiveData의 사용은 Fragment View Lifecycle 객체를 반환하는 viewLifecycleOwner를 사용하는 것이 올바른 사용법입니다. 

    viewLifecycleOwner는 onCreateView() 부터 onDestroyView() 까지의 생명주기를 가집니다. 

    즉 onDestroyView()에서 생명주기가 끝나므로 위의 중복 문제점을 해결할 수 있습니다.


    References

    Android - Lifecycle 사용 방법

    Fragment Lifecycle과 LiveData

    반응형

    댓글

Designed by Me.