inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

냉동코더의 알기 쉬운 Modern Android Development 입문

saved stated handle 질문드립니다.

288

hskim9337

작성한 질문수 8

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

        }


    }

}

architecture kotlin android jetpack

답변 1

1

냉동코더

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

Coroutine, Flow 질문

0

401

1

Transformations import 안됨

0

588

1

moshi관련 질문입니다.

0

566

2

searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.

0

375

1

안드로이드에서 아키텍처 패턴

0

423

1

RecyclerView.Adapter vs ListAdpater

0

473

1

Flows 와 Coroutine

1

573

1

[BookSearchAdapter] onBindViewHolder의 currentList[position] 질문

0

370

1

코루틴 메모리 관련해서 질문드립니다!

0

456

1

Java Bill Pugh Solution 에서 INSTANCE

0

469

1

nested json에서 특정 부분만 파싱하는법

0

495

1

Fragment에서의 viewBinding

0

525

3

toolbar 질문드립니다.

0

417

2

EditText 에서 delay 주셔서 처리하셨는데 flow 의 debounce() 하고 같은건가요?

2

568

1

코루틴 관련 질문

0

549

1

오류

1

494

2

강사님! 직렬화 라이브러리를 Moshi, kotlin serialization 두개를 사용하시던데 이유가 있으신가요?

1

749

1

EditText 는 kill 해도 값이 잘 저장되어있던데 혹시 제가 잘못테스트했을까요?

1

354

1

서버도 페이징 기능이 되는데 Paging 라이브러리가 필요할까요?

1

530

1

GSON 이 아닌 Moshi 를 사용하시는 이유가 있을까요?

1

1271

1

EditText 는 액티비티가 재생성되어도 값이 남아있던데 이유가 궁금해요

1

498

1

ViewModel 생성시 왜 초기값을 받지 않도록 했을까요?

1

438

1

Room DB에 id 항목 추가

0

255

1

안녕하세요. 용어에 대해 질문이 있어 글 남깁니다.

0

410

2