Ինչպես պահպանել ViewModel-ի վիճակը Android-ի ճարտարապետական բաղադրիչներում?
sobes.tech AI
Պատասխան AI-ից
Անձնագրել ViewModel-ի վիճակը հնարավոր է մի քանի եղանակով՝
-
Օգտագործել 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) } } -
Վիճակի պահպանում 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 վիճակի վերականգնման համար } -
Տվյալների պահպանում մշտական պահեստում: Ավելի բարդ կամ մեծածավալ տվյալների համար կարելի է օգտագործել 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-ն։