안드로이드 공식문서에서 개념을 참고했다. 간단한 카운트 증가,감소 앱을 만들어보며 개념을 이해하도록 노력했다.
-앱의 생명주기 변화시 데이터를 유지하게 해준다.
-onSaveInstanceState를 사용해서 소량의 데이터를 관리할 수 있지만 ViewModel은 대량의 데이터를 관리하기에 편하다.
-UI 컨트롤러로 ViewModel을 사용하면 데스트나 관리에 편하다
-ViewModel은 ViewModel scope에서 생명주기 전체를 관리한다
지속성을 가지고 데이터가 소멸되지 않게 관리를 해준다는 장점이 있다.
Xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="40dp"
android:id="@+id/result"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"
android:id="@+id/plus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
</androidx.appcompat.widget.AppCompatButton>
<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"
android:id="@+id/minus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent">
</androidx.appcompat.widget.AppCompatButton>
</androidx.constraintlayout.widget.ConstraintLayout>
Mainactivity.kt
class MainActivity : AppCompatActivity() {
// private var count = 0
lateinit var viewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//ViewModel 연결
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
Log.d("MainActivity","onCreate")
val plusBtn : Button = findViewById<Button>(R.id.plus)
val minusBtn : Button = findViewById<Button>(R.id.minus)
val result_text : TextView = findViewById(R.id.result)
result_text.text = viewModel.countValue.toString()
plusBtn.setOnClickListener{
// count++
// result_text.text = count.toString()
viewModel.plus()
result_text.text = viewModel.countValue.toString()
}
minusBtn.setOnClickListener {
//count--
//result_text.text = count.toString()
viewModel.minus()
result_text.text = viewModel.countValue.toString()
}
}
override fun onStart() {
super.onStart()
Log.d("MainActivity","onStart")
}
override fun onResume() {
super.onResume()
Log.d("MainActivity","onResume")
}
override fun onPause() {
super.onPause()
Log.d("MainActivity","onPause")
}
override fun onStop() {
super.onStop()
Log.d("MainActivity","onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("MainActivity","onDestroy")
}
}
ViewModel.kt
class MainViewModel : ViewModel() {
//ViewModel에서 저렇게 아래와 같이 딸랑 변수 하나만 만들어서 사용하지는 않고
//LiveData을 이용해서 사용
var countValue = 0
init {
Log.d("MainViewModel","init")
}
fun plus() {
countValue++
Log.d("MainViewModel",countValue.toString())
}
fun minus() {
countValue--
Log.d("MainViewModel",countValue.toString())
}
fun getCount() : Int {
return countValue
}
}
개념을 적용시켜 이해를 할수 있었다.