velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
를 보고 참고하면서, 나중에 삭제될 것을 염두하여, 복사 했습니다.
LiveData 는 Android JetPack 라이브러리의 하나의 기능 중 하나로
MVVM 패턴을 만들어 사용하는데 DataBinding 과 더불어 도움이 되는 라이브러리.
1. LiveData란?
LiveData는 Data의 변경을 관찰 할 수 있는 Data Holder 클래스 입니다.
일반적인 Observable과는 다르게 LiveData는 안드로이드 생명주기(LifeCycle)를 알고 있습니다. (Lifecycle-Aware)
즉, 액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(Lifecycle)를 인식하며
그에따라 LiveData는 활성상태(active)일때만 데이터를 업데이트(Update) 합니다.
활성상태란 STARTED 또는 RESUMED를 의미합니다.
또한 LiveData 객체는 Observer 객체와 함께 사용됩니다. LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우,
LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행되게 됩니다.
( 데이터 변화 감지 + 앱의 생명주기 변화 감지 )
2. LiveData 사용시 주의 할 점
LiveData 객체를 사용하기 위해서는 다음 내용을 알고 계시면 됩니다.
- Generic을 사용해 관찰하고자 하는 데이터의 타입(Type)을 갖는 LiveData 인스턴스를 생성합니다.
(보통 LiveData 객체는 안드로이드 아키텍쳐 패턴의 ViewModel 클래스 내에서 함께 사용됩니다.) - LiveData 클래스의 observe() 메소드를 사용해 Observer 객체를 LiveData 객체에 "결합" 합니다.
이때 observe() 메소드는 LifecycleOwner 객체를 필요로 하며 보통은 Activity를 전달합니다.
LiveData에 저장된 데이터에 어떠한 변화가 일어난 경우
결합된 LifecycleOwner에 의해서 상태가 active(활성)인 한 모든 데이터에 대해 Trigger가 발생합니다. - Observer 객체를 생성합니다..
생성시 LiveData가 들고있는 데이터가 변화가 일어났을 때 수행해야 할 로직이 들어있는 onChanged() 메서드를 정의해야 합니다.
보통은 액티비티나 프래그먼트 같은 UI Controller 내에서 해당 메서드를 생성합니다. - observeForever(Observer)를 통해 LifeCycleOwner 없이 Observer를 생성하여 등록할 순 있지만,
이 경우에는 Observer는 항상 active(활성) 상태이므로 데이터 변화를 항상 전달 받습니다.
단, removeObserver(Observer) 메소드를 통해 Observer를 제거 할 수 있습니다. - LiveData에 Observer를 결합하는 코드는 컴포넌트의 onCreate() 메소드 내에 위치하는 것이 바람직합니다.
그 이유는 2가지가 있습니다.
1) 안드로이드 생명주기인 onResume()에 하게될 경우 pause() 나 stop() 에 의해서 잠시 백그라운드 상에서 inactive(비활성화)된 앱이 다시 active(활성화)가 되면서 LiveData에 대한 코드가 중복호출이 될 수 있기 때문입니다.
이는 LiveData의 장점 중 {생명주기에 대한 추가적인 handling을 하지 않아도 됨}에 대해 반대되는 잘못된 방식입니다.
2) 액티비티나 프래그먼트가 active(활성화) 되자마자 UI에 표시 할 수 있는 데이터를 가질 수 있기 때문에 해당 컴포넌트는 STARTED 상태가 되자마자 LiveData 객체로부터 가장 최신의 값을 수신해야 합니다.
사용 예시
사용해도 상관없습니다.
class TestLiveDataViewModel : ViewModel() {
// String 타입의 MutableLiveData 생성, by lazy로 초기화는 뒤에
val textValue: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
class MainActivity : AppCompatActivity() {
// 전역 변수로 ViewModel lateinit 세팅
private lateinit var model: TestLiveDataViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewModel을 가져옵니다.
model = ViewModelProvider(this).get(TestLiveDataViewModel::class.java)
// Observer를 생성한 뒤 UI에 업데이트 시켜 줍니다.
val testObserver = Observer<String> { textValue ->
// 현재 MainActivity에는 TextView가 하나만 존재합니다.
// 다른 데이터를 받는 UI 컴포넌트가 있다면 같이 세팅 해줍니다.
tv_livedata_test.text = textValue
}
// LiveData를 Observer를 이용해 관찰하고
// 현재 Activity 및 Observer를 LifecycleOwner로 전달합니다.
model.textValue.observe(this, testObserver)
}
}
결론
LiveData를 통해서 UI를 업데이트하는 경우 일반적으로 Activity나 Fragment 내에서 직접 선언하는 것보다
위의 예제처럼 ViewModel 내에서 정의하고 호출하여 사용하는 것이 더 좋습니다.
이유는 다들 ViewModel이 뭔지 알고 계시듯이 액티비티와 데이터 간의 결합도를 낮추고(의존성),
UI Controller는 오직 data를 display만 하는 것을 수행하게 하는 안드로이드 아키텍처 패턴(디자인)을 유지하기 위해서입니다.
LiveData는 그냥 LiveData만 쓰면 좋은점을 크게 느끼기 힘듭니다.
하지만 Databinding, ViewModel, RoomDatabase, Reactive Programing등과 함께 쓸 경우 그 진가가 발휘되며 개발자는 아주 편하게 코딩이 가능하기 때문에 UI 출력 데이터에 관한 실수 또한 줄여줍니다.
출처 :
velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
'Android AAC' 카테고리의 다른 글
DATA_Binding : RecyclerView in fragment (0) | 2022.03.11 |
---|---|
DATA_Binding : Fragment (0) | 2022.03.10 |
Android AAC : LiveData (0) | 2021.01.07 |
Android ACC : Data Binding (0) | 2021.01.06 |
Android ACC : Lifecycles (0) | 2021.01.06 |