Sobes.tech
Middle

Hogyan menthető el a ViewModel állapota az Android architektúrális komponenseiben?

sobes.tech MI

Válasz az MI-től

A ViewModel állapotát többféleképpen lehet menteni:

  1. SavedStateHandle használata: Ez az ajánlott módszer kis adatmennyiség mentésére, amelyek szükségesek az állapot helyreállításához a folyamat megsemmisítése után. A SavedStateHandle egy Map-szerű felületet biztosít az adatok mentéséhez és lekéréséhez.

    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. Állapot mentése Bundle-ben: Az onSaveInstanceState-el együtt használva az Activity vagy Fragment saját adatait menti, nem közvetlenül a ViewModel. Ezek az adatok később felhasználhatók a ViewModel inicializálásához.

    // Activity vagy Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Az adatok mentése, amelyek később a ViewModel inicializálásához lesznek felhasználva
        outState.putString("some_data_for_vm", "fontos érték")
    }
    
    // Adatok felhasználása a ViewModel-ben (gyári osztályon keresztül)
    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("Ismeretlen ViewModel osztály")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Az initialData használata az állapot helyreállításához
    }
    
  3. Adatok mentése állandó tárolóba: Komplexebb vagy nagyobb adatmennyiség esetén a SharedPreferences, adatbázisok (pl. Room) vagy fájlok használata javasolt. A ViewModel kommunikálhat egy repository-val, amely kezeli ezekhez az adatokhoz való hozzáférést.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Példa UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Mentési logika az adatbázisba
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Lekérdezési logika az adatbázisból
        }
    }
    

A módszer kiválasztása a menteni kívánt adatok típusától és mennyiségétől, valamint az állapot helyreállítási forgatókönyveitől függ (pl. folyamat megsemmisítése vs. konfigurációváltás). A SavedStateHandle a legalkalmasabb az olyan állapot mentésére, amely túléli a folyamat megsemmisítését és lehetővé teszi a UI helyreállítását.