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()
        }
    }
}