Sobes.tech
Middle

Πώς αποθηκεύετε την κατάσταση του ViewModel στα αρχιτεκτονικά στοιχεία του Android;

sobes.tech AI

Απάντηση από AI

Υπάρχουν διάφοροι τρόποι αποθήκευσης της κατάστασης του ViewModel:

  1. Χρήση του SavedStateHandle: Ο προτιμώμενος τρόπος για την αποθήκευση μικρών ποσοτήτων δεδομένων που χρειάζονται για την επαναφορά της κατάστασης μετά την καταστροφή της διαδικασίας. Το SavedStateHandle παρέχει μια διεπαφή παρόμοια με χάρτη για την αποθήκευση και ανάκτηση δεδομένων.

    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. Αποθήκευση κατάστασης σε bundle (Bundle): Χρησιμοποιείται μαζί με το onSaveInstanceState για την αποθήκευση δεδομένων της δικής του Activity ή Fragment, όχι άμεσα του ViewModel. Στη συνέχεια, αυτά τα δεδομένα μπορούν να χρησιμοποιηθούν για την αρχικοποίηση του ViewModel κατά τη δημιουργία του.

    // Στο Activity ή Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Αποθήκευση δεδομένων που θα χρησιμοποιηθούν για την αρχικοποίηση του ViewModel
        outState.putString("some_data_for_vm", "σημαντική τιμή")
    }
    
    // Χρήση δεδομένων στο ViewModel (μέσω εργοστασίου)
    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("Άγνωστη κλάση ViewModel")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Χρήση του initialData για την αποκατάσταση της κατάστασης
    }
    
  3. Αποθήκευση δεδομένων σε μόνιμη αποθήκευση: Για πιο πολύπλοκα ή μεγαλύτερα δεδομένα, μπορείτε να χρησιμοποιήσετε το SharedPreferences, βάσεις δεδομένων (π.χ., Room) ή αρχεία. Το ViewModel μπορεί να αλληλεπιδρά με ένα αποθετήριο που διαχειρίζεται την πρόσβαση σε αυτά τα δεδομένα.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Παράδειγμα UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Λογική αποθήκευσης στη βάση δεδομένων
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Λογική ανάκτησης από τη βάση δεδομένων
        }
    }
    

Η επιλογή της μεθόδου εξαρτάται από τον τύπο και τον όγκο των δεδομένων που πρέπει να αποθηκευτούν, καθώς και από τα σενάρια αποκατάστασης κατάστασης που πρέπει να υποστηρίζονται (π.χ., καταστροφή διαδικασίας vs αλλαγή διαμόρφωσης). Το SavedStateHandle είναι η πιο κατάλληλη επιλογή για την αποθήκευση κατάστασης που πρέπει να επιβιώσει από την καταστροφή της διαδικασίας και να επαναφέρει το UI.