Sobes.tech
Junior

Πες μου για το 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 ή άλλα αντικείμενα με κύκλο ζωής, για να αποφευχθούν διαρροές μνήμης.