• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

saved stated handle 질문드립니다.

22.09.13 12:49 작성 조회수 183

0

finish를 통해서 나갔다오니까 값이 저장이 안되어있는데뭐가 문제인가요? 정상적으로 실행은됩니다.

 


package com.example.practice_viewmodel

import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel

class MyViewModel(
    _counter:Int,
    private val savedStateHandle: SavedStateHandle

):ViewModel() {
    var counter =savedStateHandle.get<Int>(SAVE_STATE_KEY) ?:_counter

    fun saveState() {
        savedStateHandle.set(SAVE_STATE_KEY,counter)

    }
    companion object { //saved state는 key,value로 저장하기때문에 필요
    private const val SAVE_STATE_KEY = "counter"
    }



}

MyViewModel.kt

 

 

MyViewModelfactory.kt

 

package com.example.practice_viewmodel

import android.os.Bundle
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.savedstate.SavedStateRegistryOwner
import java.lang.IllegalArgumentException

//class MyViewModelFactory(private val Counter:Int) : ViewModelProvider.Factory {
//    override fun<T:ViewModel> create(modelClass:Class<T>) : T {
//        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
//            return MyViewModel(Counter) as T
//        }
//        throw IllegalArgumentException("ViewModel not ofund")
//    }
//}

class MyViewModelFactory(
    private  val counter:Int,
    owner:SavedStateRegistryOwner,
    defaultArgs: Bundle?=null,

    ):AbstractSavedStateViewModelFactory(owner, defaultArgs) {
    override fun <T : ViewModel?> create(
        key: String,
        modelClass: Class<T>,
        handle: SavedStateHandle
    ): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(counter,handle) as T
        }
        throw IllegalArgumentException("Viewmodel class not found")
    }
    }

 

 

 

mainAcitivty.kt

 

 

 

 

package com.example.practice_viewmodel

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider
import com.example.practice_viewmodel.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private val binding : ActivityMainBinding by lazy {
        ActivityMainBinding.inflate(layoutInflater)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

//        val factory = MyViewModelFactory(100)
//        //val myViewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
//        val myViewModel by viewModels<MyViewModel>() {factory}
//
//        binding.textview.text = myViewModel.counter.toString()
//
//        binding.plusBtn.setOnClickListener {
//
//            myViewModel.counter+=1
//            binding.textview.text = myViewModel.counter.toString()
//
//        }
//        binding.minusBtn.setOnClickListener {
//
//            myViewModel.counter -=1
//            binding.textview.text = myViewModel.counter.toString()
//        }
        val factory = MyViewModelFactory(100,this)
        val myViewModel by viewModels<MyViewModel>() {factory}
        binding.textview.text = myViewModel.counter.toString()
        binding.plusBtn.setOnClickListener {

            myViewModel.counter+=1
            binding.textview.text = myViewModel.counter.toString()
            myViewModel.saveState()
        }
        binding.minusBtn.setOnClickListener {

            myViewModel.counter -=1
            binding.textview.text = myViewModel.counter.toString()
            myViewModel.saveState()
        }

        binding.finish.setOnClickListener {
            finish()

        }


    }

}

답변 1

답변을 작성해보세요.

1

savedstate는 앱이 백그라운드로 들어갔을 때 시스템이 앱을 강제로 중단했을 경우 데이터를 보존하기 위해 사용하는 임시 저장소입니다. finish로 인한 종료시에는 동작하지 않는 사양으로 되어 있습니다.