Sobes.tech
Middle

Kuidas salvestada ViewModel'i olek Androidi arhitektuurikomponentides?

sobes.tech AI

Vastus AI-lt

ViewModel oleku saab salvestada mitmel viisil:

  1. Kasutades SavedStateHandle: See on soovitatav viis väikese andmemahtude salvestamiseks, mis on vajalikud oleku taastamiseks pärast protsessi hävitamist. SavedStateHandle pakub 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)
        }
    }
    
  2. Oleku salvestamine bundle-iga (Bundle): Kasutatakse koos onSaveInstanceState-ga, et salvestada Activity või Fragment andmeid, mitte otse ViewModel. Need andmed võivad olla kasutatavad ViewModel-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
    }
    
  3. Andmete salvestamine püsivasse salvestusruumi: Keerulisemate või suuremate andmemahtude salvestamiseks saab kasutada SharedPreferences, andmebaase (näiteks Room) või faile. ViewModel võ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.