Application not Responding

Aus Android Wiki

Application not Responding (Abkürzung: ANR; auf Deutsch etwa: "App reagiert nicht") ist eine Fehlersituation, die durch eine Android-App verursacht werden kann. Diese Fehlersituation wird durch das Android-System festgestellt, wenn die App länger als eine definierte Zeit benötigt, um auf eine Benutzereingabe zu reagieren und somit die Benutzeroberfläche blockiert.

Wenn das Android-System eine ANR-Situtation festgestellt hat, dann wird ein Dialog über die App gelegt, der den Nutzer darüber informiert, dass die App nicht reagiert. Dieser Dialog bietet dem Nutzer über zwei entsprechende Buttons an, die App entweder zu beenden oder nochmal einige Sekunden zu warten.[1] Auch wenn der Nutzer sich entscheiden kann, der App nochmal einige Sekunden Zeit zu geben, ist diese Fehlersitutation durch entsprechende Programmierung der App zu vermeiden.

Eine solche Fehlersituation entsteht meist dadurch, dass die App in der Event-Handler-Methode (Ereignisbehandlungs-Methode) eines GUI-Elements (z.B. Button) Programmcode ausführt, der mehrere Sekunden zur Abarbeitung benötigt (z.B. aufwändige Berechnung oder I/O-Zugriff, besonders beim Internet-Zugriff). Solche Event-Handler-Methoden werden vom sog. Main-Thread ausgeführt, der u.a. auch für die Aktualisierung der GUI sowie die Abarbeitung von GUI-Ereignissen zuständig ist. Da es nur einen Main-Thread gibt, blockiert die GUI, wenn der Main-Thread eine Event-Handler-Methode ausführt, die mehrere Sekunden zur Abarbeitung benötigt.[2]

Android überwacht das Reaktionsverhalten durch die System-Dienste Activity Manager und Window Manager. Ein ANR-Dialog wird angezeigt, wenn eine der folgenden Bedingungen erfüllt ist:

  • keine Reaktion zu einem Eingabe-Ereignis (zum Beispiel das Drücken einer Taste oder ein Touchscreen-Ereignis) innerhalb von 5 Sekunden
  • ein BroadcastReceiver wurde nicht innerhalb von 10 Sekunden beendet

Für im offiziellen App Store von Google veröffentliche Apps kann die Anzahl der von dieser App verursachten ANR-Fehler in der Google Play Developer Console für die letzten sechs Monate eingesehen werden.[3]

Technische Maßnahmen zur Vermeidung von ANR-Fehlern[Bearbeiten | Quelltext bearbeiten]

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 android.os.AsyncTask zur Verfügung. Diese Klasse hat u.a. die abstrakte Methode doInBackground(Params...), die so zu überschreiben ist, dass die langlaufende Operation in ihr enthalten ist. Nach Aufruf der Methode execute(Params...) 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 onPostExecute(Result) 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 java.lang.Thread ausgelagert werden. Hierzu ist die run()-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 java.lang.Runnable implementiert, gekapselt werden. Dieses Runnable-Objekt ist dann der Methode post(Runnable) eines UI-Elements zu übergeben, damit die GUI-Änderung vom Main-Thread ausgeführt werden kann. Alternativ kann die post(Runnable)-Methode einer Instanz der Klasse android.os.Handler verwendet werden, die mit dem Default-Konstruktor im Main-Thread erzeugt wurde.

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.
  2. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.
  3. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.