Bearbeiten von „Application not Responding

Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden. Ein eigenes Benutzerkonto hat eine ganze Reihe von Vorteilen.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 13: Zeile 13:
== Technische Maßnahmen zur Vermeidung von ANR-Fehlern ==
== Technische Maßnahmen zur Vermeidung von ANR-Fehlern ==


Langlaufende Operationen, wie aufwändige Berechnungen oder Zugriffe über das Internet, sind in einem Hintergrund-Thread auszuführen. Bei der Android-Programmierung mit der Programmiersprache [[Java]] steht hierbei u. a. die Klasse <code>[https://developer.android.com/reference/android/os/AsyncTask.html android.os.AsyncTask]</code> zur Verfügung. Diese Klasse hat u.a. die abstrakte Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...) doInBackground(Params...)]</code>, die so zu überschreiben ist, dass die langlaufende Operation in ihr enthalten ist. Nach Aufruf der Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...) execute(Params...)]</code> an einer Instanz dieser Unterklasse wird diese Methode in einem Hintergrund-Thread ausgeführt. Sind nach Abarbeitung dieser Methode Ergebnisse auf der [[GUI]] der Android-App anzuzeigen, so können diese in der Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result) onPostExecute(Result)]</code> implementiert werden, welche im Main-Thread ausgeführt wird (der Zugriff auf die GUI aus einem Hintergrund-Thread heraus ist nicht zulässig und führt zur sofortigen Beendigung der App).  
Langlaufende Operationen, wie aufwändige Berechnungen oder Zugriffe über das Internet, sind in einem Hintergrund-Thread auszuführen. Bei der Android-Programmierung mit der Programmiersprache [[Wikipedia:de:Java_(Programmiersprache)|Java]] steht hierbei u. a. die Klasse <code>[https://developer.android.com/reference/android/os/AsyncTask.html android.os.AsyncTask]</code> zur Verfügung. Diese Klasse hat u.a. die abstrakte Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...) doInBackground(Params...)]</code>, die so zu überschreiben ist, dass die langlaufende Operation in ihr enthalten ist. Nach Aufruf der Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...) execute(Params...)]</code> an einer Instanz dieser Unterklasse wird diese Methode in einem Hintergrund-Thread ausgeführt. Sind nach Abarbeitung dieser Methode Ergebnisse auf der [[GUI]] der Android-App anzuzeigen, so können diese in der Methode <code>[https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result) onPostExecute(Result)]</code> implementiert werden, welche im Main-Thread ausgeführt wird (der Zugriff auf die GUI aus einem Hintergrund-Thread heraus ist nicht zulässig und führt zur sofortigen Beendigung der App).  


Alternativ kann die langlaufende Operation unter Verwendung einer Instanz der Klasse <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html java.lang.Thread]</code> ausgelagert werden. Hierzu ist die <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#run-- run()]</code>-Methode dieser Klasse zu überschreiben, so dass die langlaufende Operation in ihr ausgeführt wird. Wenn nach Beendigung der langlaufenden Operation ein Ergebnis auf der GUI dargestellt werden soll, dann kann der entsprechende GUI-Zugriff in einem Objekt, welches das Interface <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html java.lang.Runnable]</code> implementiert, gekapselt werden. Dieses ''Runnable''-Objekt ist dann der Methode <code>[https://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable) post(Runnable)]</code> eines UI-Elements zu übergeben, damit die GUI-Änderung vom Main-Thread ausgeführt werden kann. Alternativ kann die <code>[https://developer.android.com/reference/android/os/Handler.html#post(java.lang.Runnable) post(Runnable)]</code>-Methode einer Instanz der Klasse <code>[https://developer.android.com/reference/android/os/Handler.html android.os.Handler]</code> verwendet werden, die mit dem [https://developer.android.com/reference/android/os/Handler.html#Handler() Default-Konstruktor] im Main-Thread erzeugt wurde.
Alternativ kann die langlaufende Operation unter Verwendung einer Instanz der Klasse <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html java.lang.Thread]</code> ausgelagert werden. Hierzu ist die <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#run-- run()]</code>-Methode dieser Klasse zu überschreiben, so dass die langlaufende Operation in ihr ausgeführt wird. Wenn nach Beendigung der langlaufenden Operation ein Ergebnis auf der GUI dargestellt werden soll, dann kann der entsprechende GUI-Zugriff in einem Objekt, welches das Interface <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html java.lang.Runnable]</code> implementiert, gekapselt werden. Dieses ''Runnable''-Objekt ist dann der Methode <code>[https://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable) post(Runnable)]</code> eines UI-Elements zu übergeben, damit die GUI-Änderung vom Main-Thread ausgeführt werden kann.


== Einzelnachweise ==
== Einzelnachweise ==
<references />
<references />
Bitte kopiere keine Webseiten, die nicht deine eigenen sind, benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!
Du gibst uns hiermit deine Zusage, dass du den Text selbst verfasst hast, dass der Text Allgemeingut (public domain) ist, oder dass der Urheber seine Zustimmung gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der Diskussionsseite darauf hin. Bitte beachte, dass alle Android Wiki-Beiträge automatisch unter der „Creative Commons Attribution/Share-Alike Lizenz 3.0“ stehen. Falls du nicht möchtest, dass deine Arbeit hier von anderen verändert und verbreitet wird, dann klicke nicht auf „Seite speichern“.

Um das Wiki vor automatisiertem Bearbeitungsspam zu schützen, bitten wir dich, das folgende CAPTCHA zu lösen:

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)