Android Jetpack/AAC
ViewModel 과 LiveData
wdadaww
2023. 1. 12. 17:42
- LiveData란?
- 관찰기능한(Obesrvable) 데이터 홀더 클래스입니다.
- LiveData는 Observer 패턴을 기반으로하여 ViewModel과 View간의 통신을 쉽게한다.
- 데이터 변경을 관찰해줄수있다. (LifeCycle 과 결합해서)
출처: LiveData 개요 | Android 개발자 | Android Developers
LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com
- ViewModel
View와 Model을 중개해주는 컴포넌트이다.
뷰 모델은 UI를 위한 데이터를 가지고있다.
회전해도 데이터가 살아 남는다.
ViewModel있는 로직들을 View에 사용하겟다.
출처: ViewModel 개요 | Android 개발자 | Android Developers
ViewModel 개요 | Android 개발자 | Android Developers
ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.
developer.android.com
package com.example.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
var liveCounter = MutableLiveData(0)
fun liveDataCounter () {
liveCounter.value = liveCounter.value?.plus(1)
}
}
package com.example.viewmodel
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.viewmodel.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
// 뷰모델 적용
myViewModel = ViewModelProvider(this)[MyViewModel::class.java]
// ViewModel + Livedata 적용
binding.button.setOnClickListener {
myViewModel.liveDataCounter()
}
//옵저버 패턴 (관찰해주는역할)
myViewModel.liveCounter.observe(this) {
binding.textview.text =it.toString()
}
}
}
- 옵저버 패턴(observer pattern)
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식
Transformations를 사용해 Livedata 값 변경하기
>> Trasnformations.map( 공식문서 -> Transformations | Android Developers)
- Livedata는 양방향 데이터 바인딩이나 Transformation과 함께 쓸수록 더 유용하게 사용할 수있습니다.
- Transformation은 하나의 Livedata가 변경될때 마다 다른 Livedata를 변경해줄때 사용하면 유용합니다.
- 첫번째 인자로 LiveData 넘겨준다.
- 두번째 인자 리턴 형태가 있는 함수를 넘겨주는데 반환 타입에 제한은 없다.
private val liveCounter = MutableLiveData(0)
val mapCounter: LiveData<String> = Transformations.map(liveCounter) { liveCounter ->
"${liveCounter}입니다"
}
뷰모델에서 로직을한걸 뷰에 적용해본 코드.
package com.example.viewmodel
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.viewmodel.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding =
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
// 뷰모델 적용
myViewModel = ViewModelProvider(this)[MyViewModel::class.java]
// ViewModel + Livedata 적용
binding.button.setOnClickListener {
myViewModel.liveDataCounter()
}
//옵저버 패턴 (관찰해주는역할)
myViewModel.mapCounter.observe(this) {
binding.textview.text = it.toString()
}
}
}