Operationen in der Raumdatenbank wie Einfügungen, Aktualisierungen und Abfragen sollten nicht auf dem Haupt-Thread der Benutzeroberfläche
ausgeführt werden, da sie die Benutzeroberfläche blockieren können, was dazu führen kann, dass die Anwendung nicht mehr reagiert.
Wir müssen diese Datenbankoperationen in Hintergrund-Threads auslagern.
Auf diese Weise halten Sie den UI-Thread frei, um Benutzerinteraktionen zu verarbeiten und sicherzustellen, dass Ihre Anwendung reaktionsfähig
bleibt.
Wenn wir zu den Kotlin-Abschnitten übergehen, werden wir die Coroutines verwenden, die diese Operationen im Hintergrund ausführen
werden.
In Java müssen wir jedoch Handler und Executor Service verwenden, um die Methoden im Hintergrund auszuführen.
Ich kann also nicht so schreiben.
Fügen Sie einen Kontakt hinzu und rufen Sie die Insert-Methode der Kontakt-Dao direkt auf, da dies im Haupt-UI-Thread
ausgeführt wird, was Probleme für unsere Anwendung verursacht und dazu führt, dass die A- und R-Anwendung nicht reagiert oder möglicherweise abstürzt.
Um also mögliche Fehler zu vermeiden, müssen wir Handler und die Ausführungsdienste verwenden, um diese Aufgabe oder
diesen Vorgang auszuführen.
Im Hintergrund werde ich den Executor-Dienst verwenden, ich werde ihn Executor nennen und mit der Tastenkombination Alt+Entry
diese Klasse importieren, die mit Executor dot new single thread executer und Executor-Dienst gleichzusetzen ist.
Normalerweise wird ein Thread-Pool-Executor verwendet, um diese Datenbankoperationen auf Hintergrund-Threads zu verlagern.
Auf diese Weise halten Sie den UI-Thread frei, um Benutzerinteraktionen zu verarbeiten, und stellen sicher, dass Ihre
Anwendung reaktionsfähig bleibt, da ein Single-Thread-Executor erstellt wird, d. h., dass Datenbankoperationen sequentiell in
einem Hintergrund-Thread ausgeführt werden.
Dies kann dazu beitragen, Gleichzeitigkeitsprobleme beim Datenbankzugriff zu vermeiden.
Der zweite Schritt besteht darin, den Handler mit der Tastenkombination Alt+Enter zu importieren und darauf zu achten,
dass der Handler aus dem OS-Paket dem neuen Handler entspricht.
Und hier muss ich den Looper-Punkt verwenden, also den Hauptlooper.
Warum wir Handler verwenden, während Datenbankoperationen im Hintergrund ablaufen, müssen Sie oft die Benutzeroberfläche mit den Ergebnissen
dieser Operationen aktualisieren.
Aktualisierungen der Benutzeroberfläche müssen jedoch im Haupt-Thread der Benutzeroberfläche durchgeführt werden, um Probleme mit der Ansicht zu vermeiden.
Der Handler mit Looper dot get main Looper-Methode wird verwendet, um Aufgaben an die Nachrichtenwarteschlange des Haupt-UI-Threads zu senden.
Dadurch wird sichergestellt, dass jeglicher UI-bezogener Code, wie z. B. die Aktualisierung von Textansichten oder Recycler-Ansichten, auf dem Hauptthread ausgeführt
wird.
Wir müssen also den Kontext hinzufügen im Hintergrund ausführen.
Ich verwende also den Executor-Dienst.
Ich muss die Benutzeroberfläche, die Textansichten oder die Recycleransicht aktualisieren.
Deshalb verwende ich den Handler mit Looper, indem ich einen Executor Service mit dem Handler kombiniere.
Dies ist für Datenbankoperationen im Hintergrund und Handler für UI-Updates.
Sie erzielen viele Vorteile, wie z. B. Thread-Trennung, Synchronisierung und reaktionsschnelle UI-Thread-Trennung im Hintergrund. Datenbankoperationen
werden von UI-Aktualisierungen getrennt, wodurch UI-Blockierungen und Fehler durch eine nicht reagierende Anwendung verhindert
werden.
Synchronisierung.
Der gleichzeitige Zugriff auf die Datenbank wird vom Ausführungsdienst verwaltet, wodurch sichergestellt wird, dass die Datenbankoperationen
sequentiell ablaufen und Wettlaufbedingungen vermieden werden.
Responsive UI-Updates werden auf dem Haupt-Thread mit Hilfe des Handlers durchgeführt, um eine responsive Benutzeroberfläche zu gewährleisten.
Ich muss den Executor verwenden, um diese Methode im Hintergrund auszuführen, und ich werde den Handler verwenden, um die Benutzeroberfläche zu aktualisieren.
Dazu muss ich die Executor-Dot-Execute-Methode verwenden.
Und hier muss ich eine neue Runnable verwenden und wie Sie sehen können, habe ich sie überschrieben.
Die Laufmethode.
Ich muss diese Methode hier in den Lauf verschieben.
Die Methode Runnable ist eine Schnittstelle, die eine auszuführende Aufgabe definiert.
Normalerweise in einem separaten Thema.
Sie stellt eine Arbeitseinheit dar, die synchron ausgeführt werden kann.
Runnable-Objekte werden häufig mit Thread-bezogenen APIs verwendet, einschließlich des Executer-Dienstes zur Durchführung
von Hintergrundaufgaben, und die runnable-Schnittstelle definiert eine einzelne Methode void run, die ausgeführt wird, wenn die runnable
Aufgabe ist.
Ausgeführt.
Runnable-Objekte werden verwendet, um Code zu kapseln, der asynchron in einem separaten Thread ausgeführt werden
soll. Indem Sie ein Runnable an einen Executor-Dienst übergeben, delegieren Sie die Ausführung dieser Aufgabe an den vom Executor
verwalteten Thread.
Um diesen Code im Hintergrund auszuführen, müssen wir also einen Executor erstellen, der für Datenbankoperationen im Hintergrund
verwendet wird, den Executor-Dienst.
Dann müssen wir den Handler für die Aktualisierung der Benutzeroberfläche verwenden, und die Verknüpfung dieses Executors mit runnable
wird verwendet, um die Run-Methode bereitzustellen, die diesen Code asynchron auf einem separaten Thread ausführen wird.
So führen wir in Java Hintergrundaufgaben aus.
Ich werde das Gleiche mit den anderen Methoden tun.
Ich verschiebe diesen Code und muss ihn im Repository-Konstruktor initialisieren und ihn öffentlich machen, um ihn
in den anderen Methoden zu verwenden und die Duplizierung von Code zu verhindern.
Also hier Executor und ich muss diese Handler und Handler zu schneiden.
Okay, das ist aus dem Repository-Konstruktor und ich werde den Executor in den anderen Methoden wie Kontakt löschen
verwenden.
Hier, Executor, muss ich also ein neues Runnable bereitstellen, und innerhalb der Ausführung muss ich diese Methode verschieben und
im Hintergrund ausführen.