Sobes.tech
Junior

Pastāsti man par Jetpack ViewModel.

sobes.tech AI

Atbilde no AI

ViewModel saglabā un pārvalda UI saistītos datus, ņemot vērā dzīves ciklu. Tas pārdzīvo konfigurācijas izmaiņas (ekrāna apgriešanu, izkārtojuma izmaiņas), novēršot datu zudumu.

Galvenās īpašības:

  • Datu saglabāšana: ViewModel netiek iznīcināts konfigurācijas izmaiņu laikā, saglabājot UI stāvokli.
  • Lojikas atdalīšana no UI: Biznesa loģika tiek ievietota ViewModel, kas atvieglo testēšanu un uzturēšanu Activity/Fragment.
  • Integrācija ar LiveData: Bieži tiek izmantota ar LiveData datu izmaiņu novērošanai.

Piemērs:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Dati, kurus nepieciešams saglabāt konfigurācijas izmaiņu laikā
    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)

        // Saņem ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

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

        // Parāda datus no ViewModel
        updateCounterDisplay()

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

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

Dzīves ilgums: ViewModel dzīvo tik ilgi, kamēr dzīvs ir saistītais Scope (piemēram, Activity). Kad Scope beidzas, ViewModel tiek iznīcināts.

ViewModelProviders (tagad – ViewModelProvider) tika izmantots, lai iegūtu ViewModel eksemplāru pirms Kotlin. Kotlin ieteicams izmantot ViewModelProvider(this).get(MyViewModel::class.java):

Galvenās priekšrocības salīdzinājumā ar parastajām klasēm UI stāvokļa glabāšanai:

  • Pārdzīvo konfigurācijas izmaiņas.
  • Ir pārvaldīts ar Jetpack dzīves cikla ietvaru.

Trūkumi:

  • Var kļūt pārāk liels sarežģītas UI loģikas gadījumā.
  • Nedrīkst saturēt atsauces uz View, Context vai citiem dzīves cikla objektiem, lai izvairītos no atmiņas noplūdēm.