Sobes.tech
Middle

Wie speichert man den Zustand des ViewModel in den Architekturkomponenten von Android?

sobes.tech KI

Antwort von AI

Es gibt mehrere Möglichkeiten, den Zustand von ViewModel zu speichern:

  1. Verwendung von SavedStateHandle: Die bevorzugte Methode zum Speichern kleiner Datenmengen, die zum Wiederherstellen des Zustands nach der Zerstörung des Prozesses erforderlich sind. SavedStateHandle bietet eine Map-ähnliche Schnittstelle zum Speichern und Abrufen von Daten.

    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. Speichern des Zustands in einem Bundle (Bundle): Wird zusammen mit onSaveInstanceState verwendet, um Daten des eigenen Activity oder Fragment zu speichern, nicht direkt des ViewModel. Diese Daten können dann zur Initialisierung des ViewModel bei dessen Erstellung verwendet werden.

    // In Activity oder Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Speichern der Daten, die später zur Initialisierung des ViewModel verwendet werden
        outState.putString("some_data_for_vm", "wichtiger Wert")
    }
    
    // Verwendung der Daten im ViewModel (über eine Fabrik)
    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("Unbekannte ViewModel-Klasse")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Verwendung von initialData zur Wiederherstellung des Zustands
    }
    
  3. Speichern von Daten im persistenten Speicher: Für komplexere oder größere Datenmengen können SharedPreferences, Datenbanken (z.B. Room) oder Dateien verwendet werden. Das ViewModel kann mit einem Repository interagieren, das den Zugriff auf diese Daten verwaltet.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Beispiel für UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logik zum Speichern in der Datenbank
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logik zum Abrufen aus der Datenbank
        }
    }
    

Die Wahl der Methode hängt vom Typ und Volumen der zu speichernden Daten sowie von den Szenarien zur Zustandswiederherstellung ab (z.B. Prozesszerstörung vs. Konfigurationsänderung). SavedStateHandle ist am besten geeignet, um den Zustand zu speichern, der die Zerstörung des Prozesses überleben und die UI wiederherstellen soll.