View
오늘 배워 볼 것
오늘은 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() 함수를 위와 같이 변경해주어야된다.
'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 |