▷ LiveData
: LiveData는 Data 변경을 관찰할 수 있는 Data Holder 클래스입니다.
일반적인 Observable과는 달리, 안드로이드 생명주기(LifeCycle)를 알고 있습니다.
Activity, Fragment, Service와 같은 안드로이드 Component LifeCycle를 인식하고
그에 따라 LiveData는 활성상태(Active)일때만 데이터를 Update합니다.
* 활성상태 : STARTED / RESUMED 를 의미
- LiveData 특징
● Observer 패턴에 따라 데이터 변경이 일어날 때마다 Observer 객체에 알려줍니다.
매번 UI를 업데이트 하는 코드 작성할 필요없이 데이터 상태와 UI를 일치시켜줍니다.
● 메모리 누수가 없습니다.
Observer 객체는 안드로이드 생명주기와 결합되어 있기 때문에 컴포넌트가 Destory 되어도 메모리에서 스스로 해제합니다.
● 항상 최신 데이터를 유지합니다.
화면 구성이 변경(디바이스 회전)되어도 데이터를 유지합니다.
● 자원(Resource)을 공유할 수 있습니다.
LiveData를 상속하여 자신만의 LiveData클래스를 구현할 수 있고 싱글톤 패턴을 이용하여 앱 어디서나 자원을 공유할 수 있습니다.
- LiveData 사용법 (예제코드)
1. ViewModel 클래스 생성
class TestLiveDataViewModel : ViewModel() {
// String 타입의 MutableLiveData 생성, by lazy로 초기화는 뒤에
val textValue: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
2. MainActivity의 onCreate에 Observer 세팅
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)
}
}
▷ MutableLiveData
: LiveData를 상속하고 LiveData.setValue(), LiveData.postValue() 구현한 클래스.
- setValue() : main thread에서 즉시 값 변경하고 옵저버로 데이터 변경 알려줍니다.
- postValue() : Runnable로 데이터 변경 요청, Runnable이 실행될때 데이터 변경, background thread에서 값을 설정. Main thread에서 runnable이 실행되기전에 post value가 여러번 호출되도 마지막 변경된 값만 전달합니다.
▷ 결론
: LiveData은 변경될 수 없고, MutableLiveData는 변경될 수 있다는 말이다.
1. val name : LiveData<String> = repository.getName()
// 를 통해 직접 Room에서 생성한 LiveData를 직접 할당하거나,
2. val nameMutable = MutableLiveData<String>()
val name : LiveData<String> = nameMutable
// 와 같이 mutableLiveData를 직접생성해서 LiveData에 연결 하는 방법을 사용 해야 한다는 것이다.
※ 참고내용
https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
'안드로이드' 카테고리의 다른 글
To use Coroutine features, you must add `ktx` artifact from Room as a dependency (0) | 2021.06.25 |
---|---|
Glide를 활용한 WebView 이미지 로드 속도 높이기 (0) | 2021.06.15 |
[MMS 서비스] 문자 이미지 첨부, 최대 용량은? (0) | 2021.04.29 |
[라인개발실록] 안드로이드 앱 빌드 시간 꿀팁 (feat. 질문 채택) (0) | 2021.04.28 |
[Android] 전화번호 하이픈(-) 자동표시하기 (0) | 2021.04.23 |
댓글