ViewModel

차누·2023년 5월 22일
0

안드로이드 공식문서에서 개념을 참고했다. 간단한 카운트 증가,감소 앱을 만들어보며 개념을 이해하도록 노력했다.

ViewModel 개념

-앱의 생명주기 변화시 데이터를 유지하게 해준다.
-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
    }
}

개념을 적용시켜 이해를 할수 있었다.

profile
to be good programmer

0개의 댓글