Πες μου για το 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) χρησιμοποιούνταν για την απόκτηση ενός instance του ViewModel πριν από το Kotlin. Στο Kotlin, συνιστάται η χρήση ViewModelProvider(this).get(MyViewModel::class.java).
Τα βασικά πλεονεκτήματα του ViewModel έναντι των συνηθισμένων κλάσεων για την αποθήκευση της κατάστασης του UI:
- Επιβιώνει από αλλαγές διαμόρφωσης.
- Διαχειρίζεται από το πλαίσιο ζωής του Jetpack.
Μειονεκτήματα:
- Μπορεί να γίνει πολύ μεγάλο με πολύπλοκη λογική UI.
- Δεν πρέπει να περιέχει αναφορές σε View, Context ή άλλα αντικείμενα με κύκλο ζωής, για να αποφευχθούν διαρροές μνήμης.