Sobes.tech
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-თან, რაც თავიდან აცილებს მეხსიერების ნაკადებს.

როგორ გამოიყენოთ:

  1. შექმენით კლასი, რომელიც იშლება ViewModel-დან.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // მონაცემების ინიციალიზაცია
        }
    
        fun fetchData() {
            // მონაცემების ჩატვირთვის ლოგიკა
            _data.value = "ჩატვირთული მონაცემები"
        }
    
        override fun onCleared() {
            // რესურსების გაწმენდა
            super.onCleared()
        }
    }
    
  2. მიიღეთ 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()
        }
    }
    
  3. გამოიყენეთ 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-ს მონაცემების დამუშავების ლოგიკიდან.