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:
-
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() } } -
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() } } -
Použijte
ViewModelProvider.Factorypro 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.