Vertiefendes Verständnis und Anwendung von Android Jetpack ViewModel

In der Android-Entwicklung war die Trennung von Daten und Schnittstelle schon immer eine große Herausforderung. Um dieses Problem zu lösen, hat Google ViewModel eingeführt, eine der Android-Jetpack-Komponenten. ViewModel ist eine Architekturkomponente zur Verwaltung von UI-bezogenen Daten, die Entwicklern dabei helfen kann, ein elegantes datengesteuertes und Lebenszyklusmanagement zu erreichen. In diesem Artikel werden die Verwendung und das Prinzip von ViewModel auf einfache und einfache Weise vorgestellt und Sie werden Schritt für Schritt durch die Beherrschung dieser leistungsstarken Komponente geführt.

Was ist ViewModel?

ViewModel ist eine der Android Jetpack-Komponenten. Sein Hauptzweck besteht darin, UI-Controller (z. B. Aktivität und Fragment) von der datenbezogenen Geschäftslogik zu trennen, sodass sich UI-Controller auf die Anzeige von Daten und die Reaktion auf Benutzerinteraktionen konzentrieren können, während Daten erfasst und erfasst werden Die Verarbeitung wird zur Verwaltung an ViewModel übergeben. Diese Trennung macht den Code sauberer und einfacher zu testen und zu warten.

Das Prinzip von ViewModel

Das Prinzip von ViewModel ist eigentlich nicht kompliziert. Wenn sich die Gerätekonfiguration ändert (z. B. Bildschirmdrehung) und die Aktivität oder das Fragment neu erstellt wird, wird das ViewModel nicht zerstört, sondern verbleibt im Speicher. Auf diese Weise kann der UI-Controller nach der Rekonstruktion die vorherige ViewModel-Instanz erneut abrufen und die darin enthaltenen Daten weiterhin verwenden, wodurch Datenverlust und wiederholtes Laden vermieden werden.

ViewModelStore und ViewModelStoreOwner

Das Prinzip von ViewModel umfasst zwei Kernkonzepte: ViewModelStore und ViewModelStoreOwner.

ViewModelStore ist ein Container, der ViewModel-Instanzen speichert, und sein Lebenszyklus ist mit dem Lebenszyklus des UI-Controllers verknüpft. Wenn der UI-Controller (Aktivität oder Fragment) zerstört wird, bereinigt ViewModelStore die darin enthaltene ViewModel-Instanz, um Speicherverluste zu vermeiden.

ViewModelStoreOwner ist das Objekt, dem ViewModelStore gehört, normalerweise Aktivität oder Fragment. ViewModelProvider ruft ViewModelStore über ViewModelStoreOwner ab und verwaltet den Lebenszyklus von ViewModel über ViewModelStore.

ViewModelProvider

ViewModelProvider ist eine Toolklasse zum Erstellen und Abrufen von ViewModel-Instanzen. Es ist dafür verantwortlich, das ViewModel mit dem ViewModelStoreOwner zu verknüpfen und sicherzustellen, dass das ViewModel zum richtigen Zeitpunkt zerstört wird.

ViewModel-Instanz in Aktivität abrufen:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

Holen Sie sich die ViewModel-Instanz in Fragment:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

Verwenden Sie ViewModel

ViewModel-Abhängigkeit hinzufügen

Stellen Sie zunächst sicher, dass Ihr Projekt AndroidX verwendet hat, und fügen Sie die ViewModel-Abhängigkeit in build.gradle hinzu:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
}

Erstellen Sie ViewModels

Das Erstellen eines ViewModel ist sehr einfach: Erben Sie einfach die ViewModel-Klasse und definieren Sie darin Daten und zugehörige Vorgänge.

public class MyViewModel extends ViewModel {
    private MutableLiveData<String> data = new MutableLiveData<>();

    public LiveData<String> getData() {
        return data;
    }

    public void fetchData() {
        // 模拟异步数据获取
        new Handler().postDelayed(() -> {
            data.setValue("Hello, ViewModel!");
        }, 2000);
    }
}

Verwenden von ViewModels in UI-Controllern

Rufen Sie eine Instanz von ViewModel in Activity oder Fragment ab und beobachten Sie Datenänderungen:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});

viewModel.fetchData(); // 触发数据获取操作

ViewModel und komponentenübergreifende Kommunikation

ViewModel wird nicht nur zum Teilen von Daten innerhalb eines einzelnen UI-Controllers verwendet, sondern kann auch zum Teilen von Daten zwischen verschiedenen UI-Controllern verwendet werden, um eine komponentenübergreifende Kommunikation zu erreichen. Beispielsweise können Daten in einem Fragment über ein ViewModel an eine Aktivität übergeben werden.

Daten in Aktivität teilen:

sharedViewModel = new ViewModelProvider(this).get(SharedViewModel.class);
sharedViewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});

Daten im Fragment teilen:

sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

Hinweis: Bei der komponentenübergreifenden Kommunikation muss derselbe ViewModelProvider verwendet werden, um denselben ViewModel-Instanztyp zu erhalten. Verwenden Sie dies in Activity als Parameter von ViewModelProvider und in Fragment requireActivity() als Parameter.

ViewModel与SavedState

Manchmal möchten wir möglicherweise einige Daten im ViewModel speichern, die nichts mit dem Lebenszyklus des UI-Controllers zu tun haben, damit der Status bei der Neuerstellung wiederhergestellt werden kann. ViewModel stellt die SavedState-Funktion bereit, die es uns ermöglicht, Daten in ViewModel beizubehalten.

Beispielcode:

public class MyViewModel extends ViewModel {
    private SavedStateHandle savedStateHandle;

    public MyViewModel(SavedStateHandle savedStateHandle) {
        this.savedStateHandle = savedStateHandle;
    }

    public LiveData<String> getData() {
        return savedStateHandle.getLiveData("data");
    }

    public void setData(String data) {
        savedStateHandle.set("data", data);
    }
}

Verwenden Sie SavedStateViewModelFactory, um ein ViewModel mit SavedState-Funktionalität zu erstellen:

public class MyActivity extends AppCompatActivity {
    private MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewModelProvider.Factory factory = new SavedStateViewModelFactory(getApplication(), this);
        viewModel = new ViewModelProvider(this, factory).get(MyViewModel.class);

        viewModel.getData().observe(this, data -> {
            // 更新UI
            textView.setText(data);
        });

        if (savedInstanceState == null) {
            // 第一次创建时,触发数据获取操作
            viewModel.fetchData();
        }
    }
}

Bei der Verwendung von ViewModel zu beachtende Punkte

  • Halten Sie in ViewModel keinen Verweis auf den Kontext bereit, um Speicherverluste zu vermeiden.
  • ViewModel sollte sich nur auf Daten und Geschäftslogik konzentrieren und keine UI-bezogenen Vorgänge verarbeiten.
  • Speichern Sie keine großen Datenmengen in ViewModel, um zu vermeiden, dass zu viel Speicher beansprucht wird.
  • Wenn die Datenmenge groß ist oder Daten prozessübergreifend gemeinsam genutzt werden müssen, sollten andere Lösungen wie Room Database oder SharedPreferences in Betracht gezogen werden.

abschließend

Durch die Einleitung dieses Artikels haben Sie die Verwendung und das Prinzip von Android Jetpack ViewModel verstanden. Das Aufkommen von ViewModel vereinfacht die Datenverwaltung und Lebenszyklusverarbeitung in der Android-Entwicklung erheblich und macht Anwendungen robuster und effizienter. In der tatsächlichen Entwicklung kann Ihnen die sinnvolle Verwendung von ViewModel dabei helfen, elegante und leicht zu wartende Android-Anwendungen zu erstellen.

Android-Studiennotizen

Android-Leistungsoptimierung: https://qr18.cn/FVlo89
Android-Fahrzeug: https://qr18.cn/F05ZCM
Android-Reverse-Security-Studiennotizen: https://qr18.cn/CQ5TcL
Android-Framework-Prinzipien: https://qr18.cn/AQpN4J
Android-Audio und -Video: https://qr18.cn/Ei3VPD
Jetpack (einschließlich Compose): https://qr18.cn/A0gajp
Kotlin: https://qr18.cn/CdjtAF
Gradle: https://qr18.cn/DzrmMB
OkHttp Quellcode-Analysenotizen: https://qr18.cn/Cw0pBD
Flutter: https://qr18.cn/DIvKma
Android Eight Knowledge Body: https://qr18.cn/CyxarU
Android-Kernnotizen: https://qr21.cn/CaZQLo
Android Frühere Interviewfragen: https://qr18.cn/CKV8OZ
2023 Neueste Android-Interviewfragensammlung: https://qr18.cn/CgxrRy
Bewerbungsgesprächsübungen für die Entwicklung von Android-Fahrzeugen: https://qr18.cn/FTlyCJ
Audio- und Videointerviewfragen:https://qr18.cn/AcV6Ap

Acho que você gosta

Origin blog.csdn.net/weixin_61845324/article/details/132253303
Recomendado
Clasificación