Junior
Pričaj o Jetpack ViewModel.
sobes.tech АИ
Одговор од АИ
ViewModel je komponent Jetpack-a namenjen za skladištenje i upravljanje podacima na način koji je povezan sa UI-jem. Njegov glavni cilj je da čuva podatke UI tokom promena konfiguracije, kao što je rotacija ekrana, i da preživi životni ciklus Activity ili Fragment.
Karakteristike ViewModel-a:
- Čuvanje podataka: Preživljava promene konfiguracije i čak i smrt Activity ili Fragmenta, obnavljajući podatke pri ponovnom kreiranju.
- Odvajanje logike: Odvaja logiku pripreme podataka za UI od samog UI-ja (Activity/Fragment).
- Povezan sa životnim ciklusom: Povezan je sa životnim ciklusom Activity ili Fragmenta.
- Prevencija curenja memorije: Nema direktnu referencu na View, Lifecycle ili Activity/Fragment, čime se sprečava curenje memorije.
Kako koristiti:
-
Kreirajte klasu koja nasleđuje
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Inicijalizacija podataka } fun fetchData() { // Logika učitavanja podataka _data.value = "Učitani podaci" } override fun onCleared() { // Čišćenje resursa super.onCleared() } } -
Dobijte instancu ViewModel-a u Activity ili Fragmentu.
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 -> // Ažuriranje UI }) viewModel.fetchData() } } -
Koristite
ViewModelProvider.Factoryza kreiranje instanci ViewModel sa zavisnostima.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("Nepoznata klasa ViewModel") } } // U Activity/Fragment // val repository = MyRepository() // Injektovanje zavisnosti // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Upoređenje sa onSaveInstanceState():
| Karakteristika | ViewModel | onSaveInstanceState() |
|---|---|---|
| Preživljavanje konfiguracije | Da | Da (za manje količine podataka) |
| Preživljavanje procesa | Ne (nakon zatvaranja procesa podaci se gube) | Da (za manje količine podataka) |
| Čuvanje podataka | Objekti, LiveData | Bundle (primitivi, Serializable, Parcelable) |
| Uticaj na memoriju | Ne (ako se koristi ispravno) | Moguće ako se čuvaju reference na Activity/View |
| Složenost implementacije | Složenije za jednostavne scenarije | Jednostavnije za jednostavne scenarije |
ViewModel pomaže u pravljenju otpornijih i lakše testiranih aplikacija, odvajajući UI od logike obrade podataka.