Kuidas salvestada ViewModel'i olek Androidi arhitektuurikomponentides?
sobes.tech AI
Vastus AI-lt
ViewModel oleku saab salvestada mitmel viisil:
-
Kasutades SavedStateHandle: See on soovitatav viis väikese andmemahtude salvestamiseks, mis on vajalikud oleku taastamiseks pärast protsessi hävitamist.
SavedStateHandlepakub Map-sarnast liidest andmete salvestamiseks ja saamiseks.class MyViewModel(private val state: SavedStateHandle) : ViewModel() { private val _name = state.getLiveData<String>("name") val name: LiveData<String> = _name fun saveName(newName: String) { state.set("name", newName) } } -
Oleku salvestamine bundle-iga (Bundle): Kasutatakse koos
onSaveInstanceState-ga, et salvestadaActivityvõiFragmentandmeid, mitte otseViewModel. Need andmed võivad olla kasutatavadViewModel-i initsialiseerimisel selle loomise ajal.// Activity või Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Andmete salvestamine, mis hiljem kasutatakse `ViewModel`-i initsialiseerimiseks outState.putString("some_data_for_vm", "oluline väärtus") } // Andmete kasutamine `ViewModel`-is (fabriiki kaudu) class MyViewModelFactory(private val initialData: String) : ViewModelProvider.Factory { override fun <T : ViewModel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(initialData) as T } throw IllegalArgumentException("Tundmatu ViewModel klass") } } class MyViewModel(private val initialData: String) : ViewModel() { // Andmete kasutamine oleku taastamiseks } -
Andmete salvestamine püsivasse salvestusruumi: Keerulisemate või suuremate andmemahtude salvestamiseks saab kasutada SharedPreferences, andmebaase (näiteks Room) või faile.
ViewModelvõib suhelda repozitoriumiga, mis haldab nende andmete juurdepääsu.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Näide UserRepository-st class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Salvestuslogika andmebaasi } fun getUser(id: Long): LiveData<User> { // Andmete saamise logika andmebaasist } }
Valitud meetod sõltub salvestatavate andmete tüübist ja mahust ning olukordadest, milles on vaja olekut taastada (näiteks protsessi hävitamine vs konfiguratsiooni muutmine). SavedStateHandle on kõige sobivam oleku salvestamiseks, mis peab üle elama protsessi hävitamise ja võimaldab UI taastamist.