Sobes.tech
Middle

როგორ შევინახოთ ViewModel-ის მდგომარეობა Android-ის არქიტექტურული კომპონენტებში?

sobes.tech AI

პასუხი AI-სგან

ViewModel-ის მდგომარეობის შენახვა შესაძლებელია რამდენიმე გზით:

  1. SavedStateHandle-ის გამოყენება: ეს საუკეთესო მეთოდია მცირე მოცულობის მონაცემების შენახვისთვის, რომლებიც საჭირ են վիճակի վերականգնման համար գործընթացի განადგურების შემდეგ։ SavedStateHandle უზრუნველყოფს Map-ის მსგავსი ინტერფეის მონაცემების შენახვის და მიღების համար։

    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> {
            // მონაცემების მიღების ლოგიკა
        }
    }
    

მეთოდის არჩევანი დამოკიდებულია შენახვადი მონაცემების ტიპსა და მოცულობაზე, ასევე იმ სცენარებზე, რომლებიც საჭიროა მდგომარეობის აღდგენისათვის (მაგ. პროცესის განადგურება ან კონფიგურაციის შეცვლა). SavedStateHandle ყველაზე შესაფერისია მდგომარეობის შენახვისთვის, რომელიც უნდა გადარჩეს პროცესის განადგურების შემდეგ და UI-ს აღდგენის შესაძლებლობისთვის.