Developing Myself Everyday
article thumbnail
Published 2023. 8. 12. 13:43
[AAC] LiveData Android/AAC

 

이 게시글은 아래의 공식 문서를 보고 작성했습니다.

 

LiveData 개요  |  Android 개발자  |  Android Developers

LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.

developer.android.com


 

 

 

 

LiveData란?


`LiveData` 는 관찰 가능한 데이터 홀더 클래스입니다. 데이터의 변경 사항을 관찰하고 이에 대응하는 UI 업데이트를 수행하기 위해 사용됩니다.

 

`LiveData` 는 `LifeCycle`이 정의한 안드로이드 앱의 라이브사이클에 반응합니다.

 

` LifeCycle` 이 정의한 안드로이드 앱의 라이브사이클

 

`LiveData` `Observer` 클래스로 표현되는 Observer의 수명 주기가 `STARTED` 또는 `RESUMED` 상태이면 `LiveData` 활성 상태가 됩니다.

 

 

`LiveData` `LifecycleOwner` 인터페이스를 구현하는 객체와 연결된 관찰자를 등록할 수 있습니다. 액티비티와 프래그먼트가 바로 `LifecycleOwner` 인터페이스를 구현한 객체입니다. 그렇기에 액티비티와 프래그먼트에서 `LiveData` 와 연결된 관찰자를 등록하고 이를 관찰할 수 있습니다.

 

 

 

 

LiveData 사용의 이점


LiveData를 사용하면 다음의 이점이 있습니다.

 

UI와 데이터 상태의 일치 보장

`LiveData` Observer 패턴을 따릅니다. `LiveData` 는 기본 데이터가 변경될 때 Observer 객체에 알립니다. 코드를 통합하여 이러한 Observer 객체에 UI를 업데이트할 수 있습니다. 이렇게 하면 앱 데이터가 변경될 때마다 Observer가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없습니다.

 

메모리 누수 없음

Observer Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.

 

중지된 액티비티로 인한 비정상 종료 없음

액티비티가 백 스택에 있을 때를 비롯하여 Observer의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 `LiveData` 이벤트도 받지 않습니다.

 

수명 주기를 더 이상 수동으로 처리하지 않음

UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않습니다. `LiveData` 는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.

 

최신 데이터 유지

수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신합니다. 예를 들어 백그라운드에 있었던 액티비티는 포그라운드로 돌아온 직후 최신 데이터를 받습니다.

 

적절한 구성 변경

기기 회전과 같은 구성 변경으로 인해 액티비티 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 됩니다.

 

리소스 공유

앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 `LiveData` 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다. `LiveData` 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 Observer `LiveData` 객체를 볼 수 있습니다.

 

 

 

 

LiveData 사용


LiveData 객체 만들기

 `LiveData` 객체는 일반적으로 viewModel 객체 내에 저장되며 다음 에에서 보는 것과 같이 getter 메서드를 통해 액세스됩니다.

class NameViewModel : ViewModel() {

    // Create a LiveData with a String
    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    // Rest of the ViewModel...
}
참고: UI를 업데이트하는 `LiveData` 객체를 액티비티(activity) 또는 프래그먼트(fragment)에 저장하는 대신 ViewModel 객체에 저장하는 이유는 다음과 같습니다:
1. 액티비티와 프래그먼트의 복잡성을 줄이기 위해. 이제 이 UI 컨트롤러들은 데이터를 표시하는 역할을 담당하지만 데이터 상태를 보관하지는 않습니다
2. 특정 액티비티나 프래그먼트 인스턴스와 `LiveData` 인스턴스를 분리하여 구성 변경(configuration change)을 견딜 수 있도록 합니다.

 

 

LiveData 객체 관찰

앱 구성요소의 `onCreate()` 메서드에서 `LiveData` 객체를 주로 관찰합니다. 그 이유는 다음과 같습니다.

 

 - 시스템이 액티비티나 프래그먼트의 `onResume()` 메서드에서 중복 호출을 하지 않도록 하기 위함입니다.

 - 액티비티나 프래그먼트가 활성 상태가 되는 즉시 표시할 수 있는 데이터가 포함 되도록 하기 위함입니다. 앱 구성요소는 Observer의 수명 주기가 `STARTED`가 되는 즉시 관찰하던 `LiveData` 객체에서 최신 값을 수신합니다.

 

일반적으로 `LiveData` 는 데이터가 변경될 때 활성 관찰자에게만 업데이트를 전달합니다. 추가로 비활성 상태에서 활성 상태로 변경될 때에도 관찰자가 업데이트를 수신합니다.

 

`LiveData` 객체를 주로 관찰하는 예시 코드는 아래와 같습니다.

class NameActivity : AppCompatActivity() {

    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val nameObserver = Observer<String> { newName ->
            nameTextView.text = newName
        }

        model.currentName.observe(this, nameObserver)
    }
}

 

 

LiveData 객체 업데이트

`LiveData` 에는 저장된 데이터를 업데이트하는데 사용되는 공개된 메서드가 없지만  `LiveData` 클래스에는 `setValue()` 및 `postValue()` 메서드를 통해  `LiveData` 객체에 저장된 값을 수정할 수 있습니다.

button.setOnClickListener {
    val anotherName = "John Doe"
    model.currentName.setValue(anotherName)
}

'Android > AAC' 카테고리의 다른 글

[AAC] WorkManager  (0) 2023.08.25
[AAC] DataStore with SharedPreferences  (0) 2023.08.24
[AAC] Paging 라이브러리  (0) 2023.08.16
[AAC] LifeCycle  (0) 2023.08.03
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!