이번에는 LiveData를 이용한 데이터 바인딩이다.
우리는 저번 포스팅을 통해 DataBinding이 무엇인지 알고 있으니
LiveData에 대해 한번 알아보도록 하자.
만약 DataBinding이 뭔지 모른다면
LiveData
수명주기를 인식할 수 있는 관찰 가능한 홀더 클래스이다.
근데 이 라이브 데이터라는 친구가 혼자서는 작동을 할 수가 없는데, 그래서 Observer가 필요하다.
내가 라이브 데이터를 사용하면 Observer가 따라온다고 말을 했었는데 그 이유를 설명해 주겠다.
Observer
이 옵저버라는 친구는 진짜로 말 그대로 옵저버이다.
라이브 데이터가 값이 바뀌는지를 관측하고 바뀐다면 바뀌었다는 사실을 알고 UI를 바꾸게 된다.
아 그리고 라이브 데이터를 사용할 때 주의할 점이 있는데 라이브 데이터 자체의 값은 바꾸지 못한다.
이게 무슨 소리이냐, 라이브 데이터의 값을 바꾸기 위해서는 MutableLiveData라는 다른 클래스를 이용해 바꿔야 한다는 거다.
이게 mvvm패턴과 비슷한 느낌인데
MutableLiveData에서 값을 바꾸고 라이브 데이터가 MutableLiveData랑 연결이 되어있어 관찰자가 값 변동을 인지해 UI를 바꾸는 것이다.
그러면 이제 왜 사용하는지에 대해 알아보자.
장점
1. UI 데이터 상태의 일치 보장
앱 데이터 및 생명 주기가 변경될 때마다 observer을 통해 데이터를 변경할 수 있다.
2. 메모리 누출 없음
연결된 수명 주기가 끝나면 자동으로 삭제된다.
3. 중지된 활동으로 인한 비정상 종료 없음
관찰자의 수명 주기가 비활성화 상태이면 관찰자는 어떤 Live Data 이벤트도 받지 않음.
4. 수명주기를 수동으로 처리하지 않음
수명 주기의 변경을 자동으로 인식함으로 수동으로 처리하지 않음.
5. 최신 데이터 유지
수명 주기가 비활성화 일 경우 다시 활성화가 될 때 새로운 데이터를 받음.
이러한 이유로 라이브 데이터를 사용한다.
이제 사용법으로 넘어가자.
사용법
일단 gradle을 추가해주자
def lifecycle_version = "2.3.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
첫 번째 implementation은 뷰 모델이다.
두 번째가 라이브 데이터.
일단 라이브 데이터를 선언해주자.
private var Text: MutableLiveData<String> = MutableLiveData()
그다음 옵저버를 달아주자.
Text.observe(this, Observer {
})
그리고 이 옵저버 안에 코드를 작성해 주면 된다.
나는 간단하게 숫자가 바뀌는 코드를 작성해 보겠다.
XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/btn_change"
app:layout_constraintVertical_chainStyle="packed"/>
<Button
android:id="@+id/btn_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Up"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/text_test"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private var liveText: MutableLiveData<String> = MutableLiveData()
private var count = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
liveText.observe(this, Observer {
text_test.text = it
})
btn_change.setOnClickListener {
liveText.value = "${++count}"
}
}
}
이렇게 라이브 데이터를 사용해 보았다.
여러 블로그를 찾아다니며 공부를 했기 때문에 생각보다 어렵지는 않았다.
공부, 포스팅에 참고한 글
'안드로이드' 카테고리의 다른 글
[안드로이드] 인텐트 알아보기 (0) | 2022.04.28 |
---|---|
[안드로이드/Kotlin] MVVM응용 - 번호 뽑기 만들기 (0) | 2022.03.18 |
[안드로이드] Databinding 알아보기 (0) | 2022.03.09 |
[안드로이드/JAVA] 안드로이드로 Wordle 만들어 보기 #2 (0) | 2022.03.08 |
[안드로이드] MVVM 알아보기 (0) | 2022.03.07 |