LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식한다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려한다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트한다.
1. UI와 데이터 상태의 일치 보장
Observer
객체에 알려 UI를 업데이트 할 수 있음. 그러므로 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 우리가 직접 업데이트 할 필요가 없음.2. 메모리 누수 없음
Lifecycle
객체에 결합되어 있어서 연결된 라이프사이클이 끝나면 자동으로 삭제됨3. 중지된 활동으로 인한 비정상 종료 없음
4. 수명주기를 수동으로 처리하지 않음
setValue()
/ postValue()
setValue()
는 MainThread가 보장될 경우 활용할 수 있음(MainThread 에서의 데이터 변경)postValue()
는 MainThread가 아닌 IO 스케줄러 활용시 활용할 수 있음(MainThread 로 데이터 전달)
- 종속성 추가
- LiveData를 사용할 곳에서 LiveData 정의하고 초기화
- LiveData에 Observer 달기
dependencies {
...
implementation 'androidx.appcompat:appcompat:1.1.0'
...
}
mainActivity
var pageNumber = MutableLiveData<String>()
// LiveData의 value의 변경을 감지하고 호출함
pageNumber.observe(this, Observer {
// it로 넘어오는 param은 LiveData의 value
binding.numTxt.text = it
})
//liveText의 value를 변경
pageNumber.value = "${lastPageNum}"
- 종속성 추가
- App 수준의 gradle에 databinding 추가
- xml 최상위 Layout
<layout></layout>
으로 감싸주기<variable/>
추가- liveData를 이용해 바꿀 텍스트에 activity의 객체인 pageNumber 추가
dependencies {
...
implementation 'androidx.appcompat:appcompat:1.1.0'
...
}
build.gradle(:app)
dataBinding {
enabled = true
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="activity"
type="com.example.MainActivity" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/backgroundLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/pageTxtView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="@dimen/dp_48"
android:layout_marginTop="@dimen/dp_44"
android:textSize="@dimen/sp_32"
android:textColor="@color/black"
tools:text="2/34"
android:text="@{activity.pageNumber}"
android:includeFontPadding="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
mainActivity
databinding이랑 같이 쓰면 LiveData의 value의 변경을 감지하고 호출 할 필요없음
var pageNumber = MutableLiveData<String>()
//liveText의 value를 변경
pageNumber.value = "${lastPageNum}"