뷰 모델은 위의 사진처럼 생명주기에 영향을 받지 않는다. 뷰 모델은 LiveData라는 것을 가진다. 그래서 생명주기로 인해서 pause 또는 Resume 등등 어떤 상황이 일어나도 LiveData를 계속 가질 수 있다. 라이브 데이터의 장점으로는 UI와 데이터 상태의 일치 보장, 메모리 누출 없음 등의 장점을 가지고 있다.
(출처 - ViewModel 개요 | Android 개발자 | Android Developers)
ViewModel을 실제로 만들어보기 위해서 프로젝트를 제작했다.
app.gradle
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0-alpha02")
implementation 'androidx.fragment:fragment-ktx:1.2.5'
// LiveData
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.1.0")
}
androix의 뷰모델과 liveData를 사용하기 위해서 다음과 같이 적용했다. 버전은 아래 출처를 통해서 참고해주세요
(출처 - Lifecycle | Android 개발자 | Android Developers)
ViewModel
package com.example.viewmodel_tutorial
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
enum class ActionType{
PLUS, MINUS
}
// 데이터 변경
// 뷰 모델은 데이터의 변경사항을 알려주는 라이브 데이터를 가지고 있다.
class MyNumberViewModel : ViewModel() {
// Mutal Live Data - 수정 가능
// Live Data - 읽기 전용
// 내부에서 설정하는 자료형은 뮤터블
// 변경 가능하도록 설정
private val _currentValue = MutableLiveData<Int>()
val currentValue: LiveData<Int>
get() = _currentValue
// init 초기값 설정
init{
Log.d("MyNumberViewModel", "MyNumberViewModel - () called()")
_currentValue.value = 0
}
// 뷰 모델 값 변경
fun updateValue(actionType: ActionType, input:Int){
when(actionType){
ActionType.PLUS ->
_currentValue.value = _currentValue.value?.plus(input)
ActionType.MINUS ->
_currentValue.value = _currentValue.value?.minus(input)
}
}
}
MainActivity
package com.example.viewmodel_tutorial
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import java.lang.Integer.parseInt
class MainActivity : AppCompatActivity(), View.OnClickListener {
lateinit var plus:Button
lateinit var minus:Button
lateinit var myNumberViewModel: MyNumberViewModel
private val myNumberViewModels : MyNumberViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var text:TextView = findViewById(R.id.textView2)
myNumberViewModels.currentValue.observe(this, Observer{
text.text = it.toString()
})
plus = findViewById(R.id.button)
minus= findViewById(R.id.button2)
plus.setOnClickListener(this)
minus.setOnClickListener(this)
}
override fun onClick(v: View?) {
var edit:EditText = findViewById(R.id.EditText)
val userInput:Int = parseInt(edit.text.toString())
when(v){
plus->
myNumberViewModels.updateValue(actionType = ActionType.PLUS, userInput)
minus->
myNumberViewModels.updateValue(actionType = ActionType.MINUS, userInput)
}
}
}
결과창
'안드로이드 > 잡다한 지식' 카테고리의 다른 글
안드로이드 JCenter Deprecated 소식 (0) | 2021.10.20 |
---|---|
뷰 바인딩 (0) | 2021.07.12 |
안드로이드 스튜디오 EditText 밑줄 제거 (0) | 2021.03.02 |
안드로이드 스튜디오 Recycler View 사용 (0) | 2021.02.18 |
안드로이드 스튜디오 intent로 bitmap 넘기기 (0) | 2021.01.30 |