Sobes.tech
Junior

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

sobes.tech AI

Отговор от AI

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

Характеристики на ViewModel:

  • Запазване на данни: Оцеляване на промените в конфигурацията и дори смъртта на Activity/Fragment, възстановявайки данните при повторно създаване.
  • Отделяне на логиката: Разделя логиката за подготовка на данните за UI от самия UI (Activity/Fragment).
  • Свързан с жизнения цикъл: Свързан е с жизнения цикъл на Activity или Fragment.
  • Предотвратяване на течове на памет: Няма директна препратка към View, Lifecycle или Activity/Fragment, което предотвратява течове на памет.

Как да го използвате:

  1. Създайте клас, наследяващ ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Инициализация на данните
        }
    
        fun fetchData() {
            // Логика за зареждане на данни
            _data.value = "Заредени данни"
        }
    
        override fun onCleared() {
            // Изчистване на ресурси
            super.onCleared()
        }
    }
    
  2. Получете екземпляр на ViewModel в Activity или Fragment.

    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 ->
                // Обновяване на UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Използвайте ViewModelProvider.Factory за създаване на екземпляри на ViewModel с зависимости.

    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("Неизвестен клас на ViewModel")
        }
    }
    
    // В Activity/Fragment
    // val repository = MyRepository() // Инжектиране на зависимост
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Сравнение с onSaveInstanceState():

Характеристика ViewModel onSaveInstanceState()
Преминаване през конфигурации Да Да (за малки обеми данни)
Преминаване на процеса Не (след затваряне на процеса данните се губят) Да (за малки обеми данни)
Съхраняване на данни Обекти, LiveData Bundle (примитиви, Serializable, Parcelable)
Утечки на памет Не (при правилна употреба) Възможно при съхраняване на препратки към Activity/View
Сложност на реализиране По-сложно за прости сценарии По-лесно за прости сценарии

ViewModel помага за създаването на по-устойчиви и лесно тестируеми приложения, като отделя UI от логиката за обработка на данни.