Junior
გააზიარე Jetpack ViewModel-ის შესახებ.
sobes.tech AI
პასუხი AI-სგან
ViewModel — Jetpack კომპონენტია, რომელიც განკუთვნილია მონაცემების შენახვა და მართვა UI-სთან დაკავშირებულ გზით. მისი ძირითადი მიზანია შეინახოს UI მონაცემები კონფიგურაციის ცვლილებების დროს, როგორიცაა ეკრანის მობრუნება, და გადარჩეს Activity ან Fragment-ის სიცოცხლის ციკლი.
ViewModel-ის მახასიათებლები:
- მონაცემების შენახვა: გადარჩება კონფიგურაციის ცვლილებები და甚至 Activity/Fragment-ის სიკვდილი, მონაცემების აღდგენა გადაკეთების დროს.
- ლოგიკის გამოყოფა: გამოყოფს მონაცემების მომზადების ლოგიკას UI-დან (Activity/Fragment).
- ცხოვრების ციკლის მხარდაჭერა: დაკავშირებულია Activity ან Fragment-ის სიცოცხლის ციკლთან.
- მეხსიერების ნაკადების თავიდან აცილება: არ აქვს პირდაპირი კავშირი View, Lifecycle ან Activity/Fragment-თან, რაც თავიდან აცილებს მეხსიერების ნაკადებს.
როგორ გამოიყენოთ:
-
შექმენით კლასი, რომელიც იშლება
ViewModel-დან.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // მონაცემების ინიციალიზაცია } fun fetchData() { // მონაცემების ჩატვირთვის ლოგიკა _data.value = "ჩატვირთული მონაცემები" } override fun onCleared() { // რესურსების გაწმენდა super.onCleared() } } -
მიიღეთ ViewModel-ის ობიექტი Activity ან Fragment-ში.
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.data.observe(this, Observer { newData -> // UI-ის განახლება }) viewModel.fetchData() } } -
გამოიყენეთ
ViewModelProvider.Factoryშექმნისთვის ViewModel-ის ინექციის Dependencies-თან.class MyViewModel(private val repository: MyRepository) : ViewModel() { // ... } class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(repository) as T } throw IllegalArgumentException("Unknown ViewModel class") } } // Activity/Fragment-ში // val repository = MyRepository() // დამოკიდებულების ინექცია // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
შედარება onSaveInstanceState()-თან:
| მახასიათებელი | ViewModel | onSaveInstanceState() |
|---|---|---|
| კონფიგურაციის ცვლილების გადარჩენა | დიახ | დიახ (მცირედ მონაცემებისთვის) |
| პროცესის გადარჩენა | არა (პროსესის განადგურების შემდეგ მონაცემები იკარგება) | დიახ (მცირედ მონაცემებისთვის) |
| მონაცემების შენახვა | ობიექტები, LiveData | Bundle (პრიმიტივები, Serializable, Parcelable) |
| მეხსიერების ნაკადები | არა (სწორი გამოყენების შემთხვევაში) | შესაძლებელია მეხსიერების ნაკადების წარმოქმნა Activity/View-ის შენახვისას |
| რეალიზაციის სირთულე | უფრო რთული მარტივი სცენარებისთვის | უფრო მარტივი მარტივი სცენარებისთვის |
ViewModel ეხმარება შექმნას უფრო მდგრადი და მარტივად ტესტირებადი აპლიკაციები, გამოყოფს UI-ს მონაცემების დამუშავების ლოგიკიდან.