불로구

안드로이드(Kotlin) - LiveData 본문

프로그래밍/코틀린 안드로이드

안드로이드(Kotlin) - LiveData

맹이맹이 2021. 4. 6. 09:53
반응형

LiveData

-> Data의 변경을 관찰 할 수 있는 Data Holder 클래스

-> LiveData는 Observable과 다르게 안드로이드의 생명주기를 알고 있다.

-> 활성상태에서만 데이터를 업데이트

-> LiveData는 Observer 객체와 같이 사용하여 LiveData가 가지고 있는 데이터에 변화가 발생 시 Observer 객체에 알려주고 Observer의 onChanged() 메서드 실행

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

this는 클래스를 가리키는 LifeCycleOwner 클래스가 안드로이드 생명주기를 알고 있다.

 

장점

-> Data와 Ui 동기화 : 옵저버 패턴을 이용하여 데이터 변경 마다 Observer 객체에 전달

-> 메모리 누수 방지 : 옵저버 객체를 통해 Destroy될 경우 메모리를 스스로 해제

-> Stop 상태 액티비티와 크래쉬 발생 방지 : 옵저버의 생명주기가 비활성인 경우 LiveData 이벤트 수신x

-> 항상 최신 데이터 유지

-> 자원 공유

 

사용법

-> Generic을 사용하여 관찰할 데이터의 타입을 갖는 LiveData 생성

-> 옵저버 객체 생성

package com.example.livedata

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer

class MainActivity : AppCompatActivity() {

//    private var liveText : MutableLiveData<String> = MutableLiveData<String>().apply{
//        value = "Hello World ${++count}"
//    }
    private var count = 0;
    private var liveText : MutableLiveData<String> = MutableLiveData<String>().set("Hello World ${++count}")
    private val text_test:TextView by lazy{
        findViewById<TextView>(R.id.text_test)
    }
    private val btn_change:Button by lazy{
        findViewById<Button>(R.id.btn_change)
    }

    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 = "Hello World ${++count}"
        }
    }
}

private fun MutableLiveData<String>.set(value:String) : MutableLiveData<String>{
    this.value = value
    return this
}
반응형
Comments