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-ն։