Sobes.tech
Junior

Разкажи ми за Jetpack ViewModel.

sobes.tech AI

Отговор от AI

ViewModel съхранява и управлява данните, свързани с потребителския интерфейс, като взема предвид жизнения цикъл. Той преживява промени в конфигурацията (завъртане на екрана, промени в разположението), предотвратявайки загубата на данни.

Ключови характеристики:

  • Запазване на данни: 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) се използваше за получаване на екземпляр на ViewModel преди Kotlin. В Kotlin се препоръчва да се използва ViewModelProvider(this).get(MyViewModel::class.java).

Основни предимства на ViewModel пред обикновените класове за съхранение на състоянието на UI:

  • Преживява промени в конфигурацията.
  • Управлява се от рамката на жизнения цикъл Jetpack.

Недостатъци:

  • Може да стане твърде голям при сложна логика на UI.
  • Не трябва да съдържа препратки към View, Context или други обекти с жизнен цикъл, за да се избегнат течове на памет.