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:
-
Verwendung von SavedStateHandle: Die bevorzugte Methode zum Speichern kleiner Datenmengen, die zum Wiederherstellen des Zustands nach der Zerstörung des Prozesses erforderlich sind.
SavedStateHandlebietet 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) } } -
Speichern des Zustands in einem Bundle (Bundle): Wird zusammen mit
onSaveInstanceStateverwendet, um Daten des eigenenActivityoderFragmentzu speichern, nicht direkt desViewModel. Diese Daten können dann zur Initialisierung desViewModelbei 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 } -
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
ViewModelkann 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.