Sobes.tech
Junior

Պատմիր ինձ Jetpack ViewModel-ի մասին։

sobes.tech AI

Պատասխան AI-ից

ViewModel-ը պահպանում և կառավարում է UI-կապված տվյալները՝ հաշվի առնելով կյանքի ցիկլը: Նա ապրում է կոնֆիգուրացիայի փոփոխությունների ժամանակ (էկրանին պտտում, դասավորության փոփոխություններ), կանխելով տվյալների կորուստը:

Հիմնական առանձնահատկություններ՝

  • Տվյալների պահպանություն: ViewModel-ը չի ոչնչացվում կոնֆիգուրացիայի փոփոխությունների ժամանակ, պահպանում է UI-ի վիճակը:
  • Լոգիկայի բաժանում UI-ից: Բիզնես-լոգիկան տեղադրվում է ViewModel-ում, ինչը հեշտացնում է թեստավորումը և սպասարկումը Activity/Fragment:
  • Ինտեգրացիա LiveData-ի հետ: Սովորաբար օգտագործվում է LiveData-ի հետ՝ տվյալների փոփոխությունները հետևելու համար:

Օրինակ՝

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Տվյալներ, որոնք անհրաժեշտ է պահպանել կոնֆիգուրացիայի փոփոխության ժամանակ
    var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel
    private lateinit var counterText: TextView
    private lateinit var incrementButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Ստանալ ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        counterText = findViewById(R.id.counter_text)
        incrementButton = findViewById(R.id.increment_button)

        // Ցույց տալ ViewModel-ից տվյալները
        updateCounterDisplay()

        incrementButton.setOnClickListener {
            viewModel.counter++
            updateCounterDisplay()
        }
    }

    private fun updateCounterDisplay() {
        counterText.text = viewModel.counter.toString()
    }
}

Տևողություն՝ ViewModel-ը ապրում է այնքան ժամանակ, քանի դեռ ապրում է նրա կապված Scope-ը (օր․, Activity): Երբ Scope-ը ավարտվում է, ViewModel-ը ոչնչացվում է:

ViewModelProviders (այժմ՝ ViewModelProvider) օգտագործվում էր ViewModel-ի օրինակ ստանալու համար Kotlin-ից առաջ: Kotlin-ում խորհուրդ է տրվում օգտագործել ViewModelProvider(this).get(MyViewModel::class.java):

Հիմնական առավելությունները՝

  • Կենդանանում է կոնֆիգուրացիայի փոփոխությունների ժամանակ:
  • Կառավարվում է Jetpack-ի կյանքի ցիկլի շրջանակով:

Անբարենպաստ կողմերը՝

  • Կարող է շատ մեծ լինել բարդ UI-լոգիկայի դեպքում:
  • Չպետք է պարունակի հղումներ View-ին, Context-ին կամ այլ կյանքի ցիկլ ունեցող օբյեկտների՝ խուսափելու համար հիշողության լիքներից: