til

day25

paulaner80 2022. 1. 14. 12:29
반응형

LiveData

 

LiveData는 Observable data holder class 입니다. 
LiveData는 컴포넌트들의 생명주기 상태가 active(활성화) 상태(STARTED, RESUME )일 때만 data에 대한 update를 제공합니다.


LiveData 객체에 LifecycleOwner와 함께 옵저버를 등록할 수 있습니다. (테스트 못함)
LifecycleOwner가 추가된 LiveData는 DESTROYED 상태가 되면 자동으로 제거 됩니다.
이점은 메모리 누수에 관해 걱정할 필요가 없으며, 특히 UI컴포넌트(액티비티, 프레그먼트) 등을 사용할 때 유용합니다.



LiveData 사용하기
LiveData 객체를 사용하기 위해서는 다음 몇 가지 스텝만 알고 계시면 됩니다.

1. generic을 사용해 관찰하고자 하는 데이터의 타입을 갖는 LiveData 인스턴스를 생성합니다.
(보통 LiveData 객체는 ViewModel 클래스 내에서 사용됩니다.)
[1]
private var liveText:MutableLiveData<String> = MutableLiveData<String>()

2. Observer 객체를 만듭니다. 
   onChanged() 메소드를 정의. 보통은 액티비티나 프래그먼트 같은 UI Controller 내에서 생성합니다.
3. LiveData 클래스의 observe() 메소드를 사용해 Observer 객체를 LiveData 객체에 붙입니다. 
    이때 observe() 메소드는 LifecycleOwner 객체를 필요로 합니다. (보통은 Activity를 넘기면 됩니다.) 
    LiveData에 저장된 데이터에 변화가 일어난 경우, 부착된 LifecycleOwner가 상태가 active(활성화)인 한 모든 데이터에 대해 trigger가 일어납니다.
[2,3 같이]
        liveText.observe(this, Observer {
            binding.tvTest.text = it
        })

 

 

build.gradle

...
    buildFeatures{
        dataBinding = true
    }
...

dependencies {

    def lifecycle_version = "2.4.0"
    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"

    implementation 'androidx.activity:activity-ktx:1.2.0'
...

 

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">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <Button
            android:id="@+id/btn_change"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="add 1"
            app:layout_constraintTop_toBottomOf="@+id/tv_test"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

MainActivity.kt

package com.example.livedata_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import com.example.livedata_test.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding:ActivityMainBinding

    //초기값 세팅 방법 1
//    private var liveText:MutableLiveData<String> = MutableLiveData<String>().apply{
//        value = "${count++}"
//    }

    private var liveText:MutableLiveData<String> = MutableLiveData<String>().set("0")
    private var count = 0


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        liveText.observe(this, Observer {
            binding.tvTest.text = it
        })

        binding.btnChange.setOnClickListener {
            liveText.value = "${count++}"
        }
    }

    //초기값 세팅 방법 2
    private fun MutableLiveData<String>.set(value:String): MutableLiveData<String>{
        this.value = value
        return this;
    }
}

'til' 카테고리의 다른 글

new Day 1  (0) 2022.06.09
day26  (0) 2022.01.18
day 24  (0) 2022.01.13
day23  (0) 2022.01.13
day22  (0) 2022.01.12