View

SavedStateHandle

제롱구리 2024. 3. 25. 11:07
728x90

오늘 배워 볼 것

오늘은 SavedStateHandle에 대해서 간단히 다루어 보겟당.


SavedStateHandle 넌 뭐냥?

우리는 흔히 ViewModel을 사용하는 이유가 ViewModel은 UI Data를 안전하게 보관하는 방법 중 하나로
ViewModel의 생명 주기가 Activity의 생명 주기 보다 길기 때문에 화면이 회전을 해도 데이터가 보존된다.
또한 onSavedInstaceState()를 사용하지 않기 때문에 데이터를 쉽게 저장/복원 가능하면 메모리에 저장이 가능하다.

하지만 이런 ViewModel도 메모리에 저장되기 때문에 Acdroid Frameworkd에서 메모리를 회수하게 되면 저장된 값을 잃게된다.
이런 문제점을 해결하기 위해서 ViewModel에서는 SavedstateHandle api를 이용해 백업을 사용할 수 있게 해주는 것이다.

즉 그냥 ViewModel에서 상태 저장을 위해서 SavedStatehandle를 사용하는 것이다.

  • Saved State Handle 정보가 ViewModel 전달된다
  • SavedStateViewModelFactory를 사용해야만 ViewModel을 통해서 SavedStateHandle을 전달 가능
  • SavedStateHandle은 key-Value로 이루어진 Map 형태이다.
  • 시스템이 프로세스를 종료하더라도 동일한 정보를 유지할 수 있다.
  • get(String)으로 값을 읽을 수 있다.
  • getLiveData(String)는 MutableLivedata가 반환되고, LiveData를 통해 값을 사용 가능하다.
  • set(String, Object)으로 값 쓰기가 가능하다.

예제를 확인해보자

ViewModel에서 상태 저장을 위해선 SavedStateHandle를 사용하면 된다.

class SampleViewModel @ViewModelInject constructor(
    @Assisted private val savedStateHandle: SavedStateHandle
){

    companion object {
        const val DATE_TYPE_KEY = "DATE_TYPE_KEY"
        const val IS_EMPTY_KEY = "IS_EMPTY_KEY"
    }

    private val _isEmpty = savedStateHandle.getLiveData<Boolean>(IS_EMPTY_KEY)
    val isEmpty: LiveData<Boolean> get() = _isEmpty

    private var dateType: Int? = savedStateHandle.get<Int>(DATE_TYPE_KEY)

    override fun onCleared() {
        with(savedStateHandle) 
            set(DATE_TYPE_KEY, dateType)
        }
    }
}

1.savedStateHandle.getLiveData
LiveData 형식으로 값을 들고 올 수 있다.
LiveData 값을 변경하면 자동으로 savedStateHandle 값이 갱신된다.
반대로 위와 같이 savedStateHandle 의 값을 변경시켜도 LiveData 값이 변경된다.

fun loadSuccess(list : List<Any>){
    savedStateHandle[IS_EMPTY_KEY] = list.isEmpty()
}

2.savedStateHandle.get
을 통해서 값을 가져올 수 있다.
값이 업데이트된다고 LiveData처럼 자동으로 값을 갱신 해주진 않는다.

override fun onCleared() {
    with(savedStateHandle) {
        set(DATE_TYPE_KEY, dateType)
    }
}

해당 ViewModel의 상태를 저장하고 싶은 곳에서 위와 같이 onCleared() 함수를 위와 같이 변경해주어야된다.


참고 사이트: https://rkdxowhd98.tistory.com/146

'TIL > 스터디' 카테고리의 다른 글

LinearLayoutMananger(RecyclerView 스크롤 제어)  (0) 2024.03.27
ScrollView, DataBinding(하위 View 1개만)  (1) 2024.03.26
Jetpack Navigation (safe args)  (0) 2024.03.22
Constraintlayout Chain  (0) 2024.03.21
ViewBinding(실제 에러 사례)  (0) 2024.03.20
Share Link
reply
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30