본문 바로가기
안드로이드

[안드로이드] 라이브 데이터 + 데이터 바인딩 알아보기(LiveData + DataBinding)

by krapoi 2022. 3. 11.
반응형

이번에는 LiveData를 이용한 데이터 바인딩이다.

 

우리는 저번 포스팅을 통해 DataBinding이 무엇인지 알고 있으니

LiveData에 대해 한번 알아보도록 하자.

 

만약 DataBinding이 뭔지 모른다면

DataBinding

 

[안드로이드] Databinding 알아보기

저번 MVVM을 알아보고 연습하기 위해 인터넷을 찾아봤는데 Databinding 이란 것도 알아냈다. 생각보다 유용한 거 같아 가져와 봤다. 일단 데이터 바인딩을 쓰는 이유부터 알아보자. 데이터 바인딩을

krapoi.tistory.com

 

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}"
        }
    }
}

이렇게 라이브 데이터를 사용해 보았다.

여러 블로그를 찾아다니며 공부를 했기 때문에 생각보다 어렵지는 않았다.

 

 

 

공부, 포스팅에 참고한 글

https://hoony-gunputer.tistory.com/entry/android-Live-Data

https://dev-imaec.tistory.com/39

반응형