Frage

Ich bearbeite den Code einer Android-App, die GPS-Anrufe in einem Dienst tätigt.LocationListener.Es nutzt auch ServiceConnection

In einigen Ansichten entscheidet das Gerät, dass die Antwort meiner Anwendung zu lange dauert und der Benutzer entweder „Schließen erzwingen“ oder „Warten“ kann.Bevor dieses Popup erscheint, kann der Benutzer die Anwendung noch verwenden, er kann scrollen, schieben, Tasten drücken usw.

Ich gehe nur davon aus, dass dies mit dem GPS-Dienst zusammenhängt, da dieser immer dann ausgeführt wird, wenn dieses Problem auftritt.

Ich habe gehört, dass dieses Problem mit einem Thread zu tun hat, der auf dem UIthread läuft, und nicht mit einem Hintergrundthread.Aber ich war mir sicher, dass Dienste asynchron im Hintergrundthread laufen.

Einsicht geschätzt

War es hilfreich?

Lösung

Durch die Verwendung eines Dienstes wird nicht unbedingt ein neuer Thread erzeugt, der Dienstaufruf wird im aufrufenden Thread ausgeführt.Aus dem Android API Service-Dokument unter:„Beachten Sie, dass Dienste wie andere Anwendungsobjekte im Haupt-Thread ihres Hosting-Prozesses ausgeführt werden.“

Sie können den Dienst so angeben, dass er in einem anderen Prozess ausgeführt wird. Die beste Vorgehensweise besteht jedoch darin, einen neuen Thread im Dienst zu erzeugen.

Mehr zum Android-Dienst unter:http://developer.android.com/reference/android/app/Service.html

Andere Tipps

Ich empfehle Ihnen dringend, AsyncTask zu erweitern, da dies eine ordnungsgemäße und einfache Verwendung des UI-Threads ermöglicht.Ermöglicht Ihnen, Hintergrundvorgänge auszuführen und Ergebnisse im UI-Thread zu veröffentlichen, ohne Threads und/oder Handler manipulieren zu müssen.Möglicherweise möchten Sie die gesamte Berechnung in der doInBackground-Methode durchführen.Übrigens Schließen erzwingen oder warten ist ein klassisches Verhalten für diese Art von Problemen.Viel Glück!!!

Die Verarbeitung in einem Dienst kann dennoch dazu führen, dass Ihre Anwendung hängen bleibt.

Die Lösung, die Sie implementieren sollten, besteht darin, jede Logik, die Ihre Aktivität behindern könnte, in einem separaten Thread auszuführen.Dazu gehören Dinge wie:Datenbankaktualisierungen/-einfügungen, Netzwerkkommunikation und alle anderen lang laufenden Codeteile.

Die AsyncTask ist hierfür eine praktische Methode, da Sie die Benutzeroberfläche in den Funktionen onPreExecute und onPostExecute manipulieren können.

Sie können eine AsyncTask direkt in Ihrem Dienst als Unterklasse implementieren.

Hoffentlich hilft das!Prost

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top