Junior
Ispričaj mi o Jetpack ViewModel.
sobes.tech АИ
Одговор од АИ
ViewModel čuva i upravlja podacima povezanim sa UI-jem uzimajući u obzir životni ciklus. On preživljava promene konfiguracije (rotacije ekrana, promene rasporeda), sprečavajući gubitak podataka.
Ključne osobine:
- Čuvanje podataka: ViewModel se ne uništava pri promenama konfiguracije, čuvajući stanje UI.
- Odvajanje logike od UI: Poslovna logika se smešta u ViewModel, što olakšava testiranje i održavanje Activity/Fragment.
- Integracija sa LiveData: Često se koristi sa LiveData za praćenje promena podataka.
Primer upotrebe:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Podaci koje je potrebno sačuvati pri promeni konfiguracije
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)
// Dobijanje ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Prikaz podataka iz ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Život: ViewModel živi dok traje povezani Scope (npr. Activity). Kada Scope završi, ViewModel se uništava.
ViewModelProviders (sada ViewModelProvider) se koristio za dobijanje instance ViewModel pre Kotlin-a. U Kotlin-u se preporučuje koristiti ViewModelProvider(this).get(MyViewModel::class.java).
Glavne prednosti ViewModel-a u odnosu na obične klase za čuvanje UI stanja:
- Preživljava promene konfiguracije.
- Upravljan je od strane Jetpack-ovog okvira za životni ciklus.
Nedostaci:
- Može postati prevelik kod složene UI logike.
- Ne sme sadržavati reference na View, Context ili druge objekte sa životnim ciklusom, kako bi se izbegli curenja memorije.