반응형
Notice
Recent Posts
Recent Comments
Link
불로구
안드로이드 - 내가보려고 다시쓰는 Kotlin 라이브데이터(LiveData) 본문
반응형
라이브데이터란?
- 옵저버 패턴을 사용하여 데이터의 변화가 발생 시 콜백으로 받아 처리
- 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
}
}
반응형
'프로그래밍 > 코틀린 안드로이드' 카테고리의 다른 글
안드로이드 스튜디오 - 4대 컴포넌트 (0) | 2021.04.27 |
---|---|
안드로이드 스튜디오 - MVC 패턴이란? (0) | 2021.04.23 |
안드로이드 스튜디오 - dataBinding (0) | 2021.04.22 |
안드로이드 스튜디오 - Activity 와 Fragment간 데이터 주고 받기 (0) | 2021.04.21 |
안드로이드 스튜디오 - 코틀린 쓰레드 & runOnUiThread (0) | 2021.04.20 |
Comments