코딩 일기장/Android(Kotlin)
[Android] Android Architecture Components(AAC)/안드로이드 아키텍처 컴포넌트 - 2. LiveData
minWachya
2022. 5. 29. 21:20
반응형
- Lifecycle (Easy handling lifecycles)
- LiveData (Lifecycle aware observable)
- ViewModel (Managing data in a lifecycle)
- Room (Object Mapping for SQLite)
- Paging (Gradually loading information)
2. LiveData
LiveData이란 무엇인가?
LiveData는 생명주기와 데이터의 변경을 감지할 수 있는 클래스이다.
LiveData은 어떻게 사용하는가?
1. 특정 유형의 데이터를 보유할 LiveData의 인스턴스를 생성한다.
(ViewModel 클래스 상속)
아래 예에서는 현재 이름을 관리하기 위한 LiveData 인스턴스를 생성했다.
class NameViewModel : ViewModel() {
// String 형식의 LiveData 생성
// LiveData는 abstract class이기 때문에 LiveData Class를 상속받은 MutableLiveData를 사용
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
2. LivaDate를 관찰하는 Observer 객체를 만든다. + LiveData와 연결한다.
(Activity나 Fragment 같은 UI 컨트롤러에 Observer 객체를 만듦)
설명 주석
class NameActivity : AppCompatActivity() {
// 'by viewModels()' 사용
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. ui 업데이트를 위한 observer 생성
// Observer 객체는 onChanged() 메서드를 정의함
val nameObserver = Observer<String> { newName ->
// 2. ui 업데이트
// 이 메서드는 새 이름을 받으면 ui를 업데이트하도록 정의됨
nameTextView.text = newName
}
// 3. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결함
model.currentName.observe(this, nameObserver)
}
}
3. 버튼 클릭 시 LiveData 객체 업데이트되도록 하기
LiveData의 .setValue(또는 .postValue)를 통해 observer를 호출하고,
observer애서 정의한 메서드대로 ui도 변경된다.
button.setOnClickListener {
val anotherName = "John Doe"
model.currentName.setValue(anotherName)
}
LiveData은 왜 쓰는가?(LiveData의 장점)
- UI와 데이터 상태의 일치를 보장함
- LiveData는 기본 데이터가 변경될 때 Observer 객체에 알림(Observer 패턴)
- => 앱 데이터가 변경될 때마다 Observer가 대신 UI를 업데이트하게 하면 개발자가 업데이트할 필요가 없음
- 메모리 누수 없음
- Observer는 Lifecycle 객체에 연결되어 있으며, 연결된 수명 주기가 끝나면 자동으로 삭제됨
- 중지된 활동으로 인한 비정상 종료 없음
- Observer의 수명 주기가 비활성 상태에 있으면 Observer는 어떤 LiveData 이벤트도 받지 않음
- 수명 주기를 자동으로 관리함
- UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않음
- LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리함
- 최신 데이터 유지
- 수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신함
- ex) 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받음
- 적절한 구성 변경
- 기기 회전과 같은 변경으로 인해 Activity 또는 Fragment가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 됨
- 리소스 공유
- 앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있음
- LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 Observer가 LiveData 객체를 볼 수 있음
LiveData는 언제 많이 사용되는가?
Api 응답
프래그먼트 간의 데이터 교환
데이터 통일성 유지가 필요할 때
담에 서버에서 데이터 주고받을 때 함 써봐야지
참고
https://hyuncb.tistory.com/4?category=627854
https://dev-imaec.tistory.com/39
https://todaycode.tistory.com/49
반응형