Sobes.tech
Junior

Pasakok apie Jetpack ViewModel.

sobes.tech AI

Atsakymas iš AI

ViewModel — tai Jetpack komponentas, skirtas saugoti ir valdyti duomenis UI būdu. Jo pagrindinis tikslas — išsaugoti UI duomenis keičiant konfigūraciją, pvz., ekrano pasukimą, ir išgyventi Activity ar Fragment gyvavimo ciklą.

ViewModel ypatybės:

  • Duomenų išsaugojimas: Išgyvena konfigūracijos pokyčius ir net Activity/Fragment mirtį, atkuria duomenis perkrovimo metu.
  • Logikos atskyrimas: Atskiria duomenų paruošimo logiką nuo UI (Activity/Fragment).
  • Gyvenimo ciklo palaikymas: Susijęs su Activity ar Fragment gyvavimo ciklu.
  • Atlieka atminties nutekėjimų prevenciją: Neturi tiesioginio ryšio su View, Lifecycle ar Activity/Fragment, kas užkerta kelią atminties nutekėjimams.

Kaip naudoti:

  1. Sukurkite klasę, kuri paveldi ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Duomenų inicializavimas
        }
    
        fun fetchData() {
            // Duomenų įkėlimo logika
            _data.value = "Įkelti duomenys"
        }
    
        override fun onCleared() {
            // Išteklių valymas
            super.onCleared()
        }
    }
    
  2. Gaukite ViewModel egzempliorių Activity ar 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 atnaujinimas
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Naudokite ViewModelProvider.Factory kurdami ViewModel su priklausomybėmis.

    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("Nežinoma ViewModel klasė")
        }
    }
    
    // Activity/Fragment
    // val repository = MyRepository() // priklausomybės injekcija
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Palyginimas su onSaveInstanceState():

Charakteristika ViewModel onSaveInstanceState()
Konfigūracijų pokyčių išgyvenimas Taip Taip (mažiems duomenų kiekiams)
Procesų išgyvenimas Ne (po proceso sunaikinimo duomenys prarandami) Taip (mažiems duomenų kiekiams)
Duomenų saugojimas Objektai, LiveData Bundle (primitivai, Serializable, Parcelable)
Atminties nutekėjimai Ne (teisingai naudojant) Galimi, saugant nuorodas į Activity/View
Įgyvendinimo sudėtingumas Sudėtingesnis paprastiems scenarijams Paprastesnis paprastiems scenarijams

ViewModel padeda kurti stabilesnes ir lengviau testuojamas programas, atskirdamas UI nuo duomenų apdorojimo logikos.