Sobes.tech
Junior

Pověz o Jetpack ViewModel.

sobes.tech AI

Odpověď od AI

ViewModel je komponenta Jetpacku určená pro ukládání a správu dat způsobem, který je spojen s uživatelským rozhraním (UI). Jeho hlavním cílem je uchovávat data UI během změn konfigurace, jako je otáčení obrazovky, a přežít životní cyklus aktivity nebo fragmentu.

Vlastnosti ViewModel:

  • Ukládání dat: Přežívá změny konfigurace a dokonce i smrt aktivity/fragmentu, obnovující data při znovuvytvoření.
  • Oddělení logiky: Odděluje logiku přípravy dat pro UI od samotného UI (Activity/Fragment).
  • Propojení s životním cyklem: Je spojen s životním cyklem aktivity nebo fragmentu.
  • Prevence úniků paměti: Nemá přímou referenci na View, Lifecycle nebo Activity/Fragment, což zabraňuje únikům paměti.

Jak používat:

  1. Vytvořte třídu, která dědí z ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inicializace dat
        }
    
        fun fetchData() {
            // Logika načítání dat
            _data.value = "Načtená data"
        }
    
        override fun onCleared() {
            // Vyčištění zdrojů
            super.onCleared()
        }
    }
    
  2. Získejte instanci ViewModel v Activity nebo 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 ->
                // Aktualizace UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Použijte ViewModelProvider.Factory pro vytvoření instancí ViewModel s závislostmi.

    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("Neznámá třída ViewModel")
        }
    }
    
    // V Activity/Fragmentu
    // val repository = MyRepository() // Injekce závislostí
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Porovnání s onSaveInstanceState():

Charakteristika ViewModel onSaveInstanceState()
Přežití konfigurace Ano Ano (pro malé objemy dat)
Přežití procesu Ne (po ukončení procesu jsou data ztracena) Ano (pro malé objemy dat)
Ukládání dat Objekty, LiveData Bundle (primity, Serializable, Parcelable)
Úniky paměti Ne (při správném použití) Možné při uchovávání odkazů na Activity/View
Složitost implementace Složitější pro jednoduché scénáře Jednodušší pro jednoduché scénáře

ViewModel pomáhá vytvářet odolnější a snadno testovatelné aplikace, odděluje UI od logiky zpracování dat.