불로구

안드로이드 - 내가보려고 다시쓰는 Kotlin 라이브데이터(LiveData) 본문

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

안드로이드 - 내가보려고 다시쓰는 Kotlin 라이브데이터(LiveData)

맹이맹이 2021. 4. 22. 19:41
반응형
라이브데이터란?

- 옵저버 패턴을 사용하여 데이터의 변화가 발생 시 콜백으로 받아 처리

- LifeCycleOwner를 통해 안드로이드의 LifeCycle을 알고 있기 때문에 필요하지 않을 땐 콜백을 실행하지 않는다.

- 메서드가 getLifeCycle() 뿐인 단일 메소드 인터페이스 클래스

 

장점

1. Data와 Ui간 동기화

- 옵저버 객체를 통해 데이터의 변화가 일어나는 곳마다 매번 UI를 업데이트

2. 메모리 누수가 없다

- 안드로이드의 생명주기와 연결되어 메모리상에서 스스로 해제

3. Stop 상태에서 Crash가 발생하지 않는다.

- 옵저버의 생명주기가 비활성화일경우 이벤트 수신x

4. 최신 데이터 유지 및 자원 공유

- LiveData를 상속하여 클래스를 구현하거나 싱글톤을 이용하여 시스템을 둘러싸 자원공유 가능

 

주의사항

1. 제네릭을 사용하여 관찰할 데이터의 타입을 갖는 LiveData 인스턴스 생성

2. 옵저버 객체 생성

 

실습
    <TextView
        android:id="@+id/cnt_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        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_change"
        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_toBottomOf="@id/cnt_value"
        app:layout_constraintBottom_toBottomOf="parent"/>

 

기본적으로 라이브 데이터 값을 초기화 하는 방법으로 2가지가 있다.

1. apply

private var liveText : MutableLiveData<String> = MutableLiveData<String>().apply{
   value = "apply활용 값 : ${++cnt}"
}

2. extension function

private var liveText : MutableLiveData<String> = MutableLiveData<String>().set("extension활용 값 ${++cnt}")
.
.
.
.
private fun MutableLiveData<String>.set(value: String): MutableLiveData<String> {
    this.value = value
    return this
}

LiveData는 추상클래스이므로 LiveData를 상속받는 MutableLiveData를 사용한다.

 

옵저버 생성 

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

this자리는 owner의 자리이며 현재 액티비티를 말한다.

Observer자리는 liveData의 값 변경을 감지하는 옵저버 콜백이다.

 

전체코드

package com.example.livedata2

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 val cnt_value: TextView by lazy { findViewById(R.id.cnt_value) }
    private val btn_change: Button by lazy { findViewById(R.id.btn_change) }
    private var cnt = 0

//    private var liveText : MutableLiveData<String> = MutableLiveData()
//    private var liveText : MutableLiveData<String> = MutableLiveData<String>().apply{
//        value = "apply활용 값 : ${++cnt}"
//    }
    private var liveText : MutableLiveData<String> = MutableLiveData<String>().set("extension활용 값 ${++cnt}")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

        btn_change.setOnClickListener {
            liveText.value = "값 : ${cnt++}"
        }
    }

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

 

반응형
Comments