App stürzt ab, wenn im Browser Internetseite geladen wird

  • Antworten:35
  • Forum-Beiträge: 38

23.07.2012, 13:44:29 via Website

Hallo,

ich habe bei meiner App ein komisches Verhalten festgestellt.

Meine App besteht aus einem Service, der jede Minute (Timer) zwei Webservices aufruft.
Das funktioniert alles wunderbar - stundenlang, egal ob ich meine App im Vordergund/Hintergrund halte oder andere Apps starte.
Der Service läuft immer.

Wenn ich aber ein paar Stunden nix mit dem Smartphone gemacht habe und dann mit dem Browser (z. B. GMX) aufrufe und während des Ladens der Website zu meiner App wechsle, stürzt meine App unschön ab (Fehlermeldung: Tut uns Leid...).

Wenn ich anschliessend meine App wieder neu starte und nochmals GMX im Browser aufrufe, stürzt die App nicht mehr ab.

Hat jemand eine Idee, woran das liegen könnte. Für mich hört sich das so an, als ob es am Lebenszyklus der App liegt (onPause oder onStop)..?
Aber in der Activity habe ich beide Methoden nicht implementiert, d. h. die Android-Standardmethoden werden aufgerufen..

cu
Chris
(Android 2.3)

Antworten
  • Forum-Beiträge: 38

23.07.2012, 14:03:27 via Website

Ich habe an dieser Stelle noch keine Logfunktion eingebaut, da ich noch nicht weiss, wo der Fehler auftritt (das mache ich dann noch wenn ich die Stelle gefunden habe..)
Wird das automatisch auf Betriebssystem-Ebene geloggt? Wie komme ich an das Log in meinem Smartphone?

Antworten
  • Forum-Beiträge: 38

23.07.2012, 14:31:15 via Website

In Eclipse kenne ich LogCat. Aber im Emulator habe ich meine App noch nicht stundenlang laufen lassen (könnte ich natürlich auch mal probieren..).
Danke für den Tipp mit LogCat als App für's Smartphone. Wusste nicht, dass es das gibt. Werde ich mir heute Abend herunterladen.
Ist das so aufgebaut, wie in Eclipse?

Antworten
  • Forum-Beiträge: 38

23.07.2012, 14:39:02 via Website

Von den Screeshots sieht die Logkonsole sehr ähnlich aus, wie unter Eclipse. Ich werd's heute Abend einfach mal ausprobieren!

Antworten
  • Forum-Beiträge: 38

23.07.2012, 22:19:20 via Website

Irgendwie funktioniert das bei mir nicht. Wenn ich LogCat öffne dann läuft ewig der Fortschitts-Kreis. Es kommt aber danach nix.
Habe schon versucht im Menü unter "Record" was aufzunehmen, aber dann wird nur eine leere Log-Datei abgespeichert...

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

24.07.2012, 10:34:41 via Website

Du kannst auch das LogCat von Eclipse benutzen, wenn das Gerät mit adb verbunden ist

Antworten
  • Forum-Beiträge: 38

24.07.2012, 13:40:31 via Website

ja, mit Eclipse geht das schon, aber ich möchte das ja auch von unterwegs mitloggen können. Habe mein Smartphone nicht immer am Rechner angeschlossen und für "Debugging im täglichen Ablauf" wäre eine Log-App schon sehr hilfreich..

Antworten
  • Forum-Beiträge: 33.204

24.07.2012, 13:47:13 via App

Funkfeuer
ja, mit Eclipse geht das schon, aber ich möchte das ja auch von unterwegs mitloggen können. Habe mein Smartphone nicht immer am Rechner angeschlossen und für "Debugging im täglichen Ablauf" wäre eine Log-App schon sehr hilfreich..
Es gibt auch die App "Catlog" - probiere die mal aus...

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
  • Forum-Beiträge: 38

24.07.2012, 13:53:36 via Website

Catlog habe ich schon installiert, aber wenn ich es starte dann läuft ewig der Fortschitts-Kreis und Loggings werden keine angezeigt.

Habe gelesen, dass man im ServiceMode das Logging aktivieren muss. Wenn ich allerdings das Logging zulasse und mich dann erneut in den ServiceMode anmelde, dann ist das Logging wieder deaktiviert... Schätze, dass es daran liegt..?

Antworten
  • Forum-Beiträge: 38

24.07.2012, 17:06:51 via Website

Über Eclipse habe ich auch keinen Zugriff auf die Loggings.
In der LogCat-Konsole kommt die Meldung:

1Unable to open log device '/dev/log/main': No such file or directory

Antworten
  • Forum-Beiträge: 38

25.07.2012, 07:42:39 via Website

Nachdem ich jetzt endlich mein Logging aktivieren konnte habe ich auch die Fehlermeldung(en).
Ich kann aber leider nur erkennen, dass meine test-Anwendung (test.test1) "gestorben" (died) ist und versucht wird den zur Anwendung gehörenden Hintergrundservice (AutoSyncService) wieder zu starten.
Den eigentlichen Grund, warum meine Anwendung aber "gestorben" ist, kann ich nicht erkennen.
Habe wieder mal im Browser die GMX-Startseite aufgerufen, als es passierte...

Vielleicht könnt ihr mehr erkennen:

Antworten
  • Forum-Beiträge: 38

25.07.2012, 11:07:02 via Website

@Harald Wilhelm:
Danke für den Hinweis - das wäre eine Erklärung.
Mein Gerät ist sicher nicht gut bestückt - ist das 99 Euro Huawei. Dass der Aufruf einer Internetseite allerdings schon zum Absturz der Anwendung führt ist unschön. Aber viel Apps habe ich eigentlich nicht darauf - eigentlich nur noch Qype, einen Staumelder und CatLog.. Der Rest was schon beim Kauf drauf.

Was auch komisch ist, dass zuerst meine Anwendung abgeschossen wird und dann erst die Low-Memory-Meldung kommt. Müsste es nicht eigentlich anders herum sein, oder?

Antworten
  • Forum-Beiträge: 38

26.07.2012, 07:42:23 via Website

Wie kann ich verhindern, dass Android genau den Prozess meiner App abschiesst?
An Inaktivität meiner App kann es eigentlich nicht liegen, denn es läuft ja der Background-Thread für den Service, der jede Minute eine Verbindung ins Internet aufbaut.
Kann man die Priorität meines Prozesses erhöhen bzw. hilft das überhaupt was..?!

cu
Chris

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

26.07.2012, 08:15:02 via Website

Dein Service läuft genauso wenig in einem eigenen Prozess wie auch nicht in einem eigenen Thread (ersteres müsstest Du im Manifest erzwingen, letzteres startest Du im Service bei Bedarf selbst - das machst Du ja offensichtlich).

Die Meldung (Low memory) bezieht sich nicht auf Deine App. Es ist nur ein Indikator dafür das der Speicher eng wird.

— geändert am 26.07.2012, 08:15:41

Antworten
  • Forum-Beiträge: 38

26.07.2012, 08:34:11 via Website

Ich habe eigentlich nur ein Problem damit, dass Android meine App abschiesst. Aber warum meine App - weil die App sich seit Stunden nicht im Fokus befindet?
Gibt es eine Möglichkeit das zu verhindern, dass Android meine App beendet?

Antworten
  • Forum-Beiträge: 33.204

26.07.2012, 08:40:28 via App

Funkfeuer
Ich habe eigentlich nur ein Problem damit, dass Android meine App abschiesst. Aber warum meine App - weil die App sich seit Stunden nicht im Fokus befindet?
Gibt es eine Möglichkeit das zu verhindern, dass Android meine App beendet?
Nein. Wenn Android Speicher benötigt, werden Apps gestoppt.

Das Leben des Systems ist wichtiger als die einen Befindlichkeiten einer einzelnen App.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
  • Forum-Beiträge: 38

26.07.2012, 08:55:20 via Website

Habe ich fast befürchtet, wobei es natürlich aus OS-Sicht natürlich absolut nachvollziehbar ist..
Passiert das nur meiner App, dass sie abgeschossen wird, oder auch den anderen Apps, die nicht im Fokus sind?
Im Logging kann ich nur sehen, dass meine App "sterben musste" :-(

Antworten
  • Forum-Beiträge: 33.204

26.07.2012, 09:38:14 via App

Funkfeuer
Habe ich fast befürchtet, wobei es natürlich aus OS-Sicht natürlich absolut nachvollziehbar ist..
Passiert das nur meiner App, dass sie abgeschossen wird, oder auch den anderen Apps, die nicht im Fokus sind?
Im Logging kann ich nur sehen, dass meine App "sterben musste" :-(
Was meinst Du mit "Im Fokus"?

Android behandelt natürlich alle Apps gleich...

Dass Tasks gestoppt werden, ist normal.

Wenn Dein Service permanent was tun soll, dann solltest Du den Service sich selbst neu starten lassen, wenn eine Aufgabe erledigt ist.

Timer oder Schleifen sind hingegen ungeeignet, um eine Aufgabe dauerhaft und sicher zu wiederholen.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
  • Forum-Beiträge: 38

26.07.2012, 09:45:35 via Website

Mit "im Fokus" meine ich, dass meine App nicht im Vordergrund ist - also sich im onPause() oder onStop()-Zustand befindet.
Wie starte ich einen Service neu? Ist das auch möglich, wenn der Service Bestandteil der App ist, oder muss ich eine Art "Service-App" scheiben, unabhängig von meiner App?

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

26.07.2012, 10:00:19 via Website

Die Prioritäten mit der Android Prozesse betrachtet findest Du im Lifecycle:

Process lifecycle


Nachtrag:

Services in Android werden automatisch neu gestartet wenn der entsprechende Flag im onStartCommand zurück geliefert wird. Wenn der Speicher eng ist kann aber auch passieren das die nie neu gestartet werden.

Kontrolliere doch bitte was den Speicher-Engpass auslöst. Da drumherum zu fummeln ist meines Erachtens der falsche Ansatz.

— geändert am 26.07.2012, 10:04:56

Antworten
  • Forum-Beiträge: 38

26.07.2012, 12:31:16 via Website

Services in Android werden automatisch neu gestartet wenn der entsprechende Flag im onStartCommand zurück geliefert wird.

Besagt die grün markierte Loginformation, dass Android zumindest versucht meinen Service wieder zu starteten?

Wäre für mich wichtig zu wissen, ob ich noch etwas am Code ändern muss, damit Android es zumindest versucht. Wenn dann kein Speicher mehr zu Verfügung steht, kann ich auch nix machen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

26.07.2012, 16:14:08 via Website

Ja, Dein Service wurde für einen Neustart terminiert ...

... und direkt danach kommt das LowMemory für Background Prozesse. Dein Service steht entweder eine Etage drüber (Service mit eigenem Prozess oder ganz oben wenn Service ohne eigenen Prozess).

Wie auch immer - das Problem ist das LowMemory. Evtl. wurde dadurch Dein Service auch abgeschossen. Meines Erachtens fokussierst Du auf das Falsche. Löse das Memory Problem - nicht wie Du drumherum kommst.

Antworten
  • Forum-Beiträge: 38

27.07.2012, 08:15:48 via Website

Ich muss das Problem leider aus zwei Blickwinkeln sehen:

1. Anwendersicht:
Wie Du schon sagst - Warum wird der Speicher knapp?!
Aber wie finde ich das heraus, welche App bzw. welcher Prozess so viel an Resourcen braucht? Reicht es aus CatLog mal einen Tag mitloggen zu lassen?

2. Entwicklichersicht:
Es sollen in einem bestimmten Zeitintervall Daten vom Webserver abgeholt werden. Dazu muss ich aber sicherstellen, dass der Service immer läuft - auch wenn meine App im Hintergrund läuft. Ein Anwender bekommt davon nix mit, ob der Speicher kanpp wird. Er verlässt sich darauf, dass immer wieder neue Daten eintreffen und sieht, vielleicht nur durch Zufall, dass die App nicht mehr läuft.
Sicherlich ist es kein Entwickler-Problem, wenn auf dem Smartphone die Speicherkapazitäten nicht ausreichen, aber vielleicht gibt es eine andere Möglichkeit einen Service aufrecht zu erhalten - oder zumindest dem Anwender in der NotificationBar mitzuteilen, dass der Service nicht mehr läuft?

— geändert am 27.07.2012, 08:16:08

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.07.2012, 11:10:47 via Website

Zu 1: Extende Application (e.g. MyApplication) und nutze onLowMemory() um dem Benutzer einen Toast zukommen zu lassen. Es ist nicht garantiert das der onLowMemory() gefeuert wird - aber ich würde es so machen. Weiterhin könntest Du Dir zum Start des Datenladens ein Flag in die Preferences setzen der in onLowMemory() zurückgesetzt wird. Wenn die App später wieder gestartet wird und das Flag ist im MyApplication.onCreate() noch gesetzt dann wurde onLowMemory() nicht gefeuert und Du kannst im Nachhinein einen Toast raushauen und das Flag bis zum nächsten Datenladen wieder zurücksetzen. Mehr Zeit würde ich in dieses Thema nicht investieren. Da draußen sind so unglaublich viele Geräte in so unglaublich vielen Konfigurationen. Auch viele mit falschen Konfigurationen, denk an die Chinatablets. Die vermelden z.B. sie hätten GPS an Bord haben aber keins. Ich habe aufgegeben mir darüber einen Kopf zu machen warum in einer von tausenden Konfigurationen etwas nicht läuft. Wenn ich einen Fehler erhalte wird selbstverständlich gefixt - das war es aber auch schon.

Zu 2: Wieso läuft Dein Service die ganze Zeit wenn Du nur in bestimmten Intervallen Daten lädst?

Antworten
  • Forum-Beiträge: 33.204

27.07.2012, 11:39:48 via App

Hi,

Zum Catlog: der zeichnet keinen ganzen Tag auf. Das Log enthält in der Regel nur die jeweils jüngsten 1-2 Stunden...

Zum Problem: was lädt dein Service denn da runter? Wie viele Daten sind denn das?

Und was machst Du anschließend mit den Daten?

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
  • Forum-Beiträge: 38

27.07.2012, 12:26:22 via Website

Wenn es so viele Konfigurationsmöglichkeiten gibt, möchte ich mich nicht auf "LowMemory" als Ursache beschränken. Mir wäre es wichtiger auf so viele Fehlerfälle wie möglich reagieren. Dazu reicht mir eigentlich die Information, dass der Service beendet und/oder die App gekillt wird - durchwas auch immer!
Der Service müsste doch auch eine onDestroy()-Methode haben. In der könnte ich doch eine Meldung an die NotificationBar senden bzw. einen Toast ausgeben?
Wenn die App und der damit verbundene Service beendet wird, sollte auch onDestroy() durchlaufen werden, oder?

Der Service lädt zwei Test-Datensätze über einen .NET-Webservice herunter und scheibt diese in die lokale SQLite-DB.
Ich habe den Webservice in einen Service gepackt, damit er auch ausgeführt wird, wenn die App im Hintergrund läuft - also onPause() oder onStop().
Ich würde sagen, dass das ein typischer Anwendungsbereich für den Einsatz eines Services ist.

Antworten
  • Forum-Beiträge: 33.204

27.07.2012, 12:42:07 via App

Wie häufig wird denn der Service gestartet?

Wenn zum Beispiel nur alle 4 Stunden die Daten abgerufen werden sollen, dann sollte auch der Service nur alle vier Stunden neu starten...

Das Handling der SQL Datenbank ist korrekt? Du schließt die Datenbank auch immer wieder?

Hast Du Dir den RAM Verbrauch Deines tasks angeschaut?

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.07.2012, 14:25:00 via Website

Service.onDestroy()? Theoretisch ja, aber auch hier habe ich schon "Pferde kotzen sehen". Soll heißen der Service war weg und onDestroy() kam nicht rein. Das ging dann so weit das ich in den Einstellungen noch einen Knopf eingebaut habe "Service beenden". Der ist für den seltenen Fall das ich das Ende des Service nicht mitbekommen habe und die Notification noch lustig angezeigt wurde - obwohl die Notification im onDestroy() des Service eigentlich abgeschaltet wird.

Weiterhin räume ich jetzt in manchen Apps beim Application.onCreate() auf. Das ist dann für die seltenen Fälle in denen weder Service.onDestroy() noch Application.onDestroy() rein kamen.

Das waren aber auch die einzigen Zugeständnisse.

@Carsten: Wenn nur alle 4 Stunden Daten geladen werden brauchst Du eigentlich keinen Service. Dafür würde ich den AlarmManager einsetzen.

— geändert am 27.07.2012, 14:28:41

Antworten
  • Forum-Beiträge: 38

29.07.2012, 12:57:42 via Website

Zum Catlog: der zeichnet keinen ganzen Tag auf. Das Log enthält in der Regel nur die jeweils jüngsten 1-2 Stunden...
Ich habe Catlog über Nacht laufen lassen. Es wurden die Logsätze von 22 Uhr bis 6 Uhr gefunden.

Wie häufig wird denn der Service gestartet?
Das kann der Benutzer selbst einstellen. Das kann jede Minute sein, aber auch nur alle 60 Minuten.

Das Handling der SQL Datenbank ist korrekt? Du schließt die Datenbank auch immer wieder?
Das werde ich noch genauer prüfen..

Ich habe gesehen, dass Android meine App (test1) wieder gestartet hat. Vermute, dass das nötig ist um den Service zu starten, der ja nur ein Thread der App ist.
07-28 21:51:24.280 I/ActivityManager( 145): Start proc test.test1 for service test.test1/.hilfsklassen.AutoSyncService: pid=17397 uid=10057 gids={3003}
Der Service in meiner Start-Activity wird allerdings im onResume() aufgerufen. Nachdem die App nur im Hintergrund läuft wird diese onResume() nicht aufgerufen und somit startet sich auch der Service nicht...
Wisst ihr in welcher Methode ich den Service starten muss, damit er auch gestartet wird, wenn die App von Android gestartet wird? Habe es in der onRestart() versucht, aber die wird nicht aufgerufen. :-(

Antworten
  • Forum-Beiträge: 38

29.07.2012, 16:24:28 via Website

Diese Apps wurden von Android ebenfalls gekillt. Ist von denen einer dabei der so viel Speicher frisst?

07-29 15:41:34.970: I/ActivityManager(145): Process com.huawei.netassistant (pid 7558) has died.
07-29 15:42:15.350: I/ActivityManager(145): Process com.cooliris.media (pid 8663) has died.
07-29 15:54:00.430: I/ActivityManager(145): Process com.google.android.apps.maps:FriendService (pid 8726) has died.
07-29 16:12:36.760: I/ActivityManager(145): Process com.huawei.socialext (pid 8424) has died.
07-29 16:15:49.370: I/ActivityManager(145): Process com.huawei.netassistant (pid 8810) has died.
07-29 16:15:53.910: I/ActivityManager(145): Process com.android.email (pid 5009) has died.
07-29 16:15:57.080: I/ActivityManager(145): Process com.nolanlawson.logcat (pid 4962) has died.
07-29 16:17:29.660: I/ActivityManager(145): Process com.android.settings (pid 9644) has died.
07-29 16:17:30.900: I/ActivityManager(145): Process com.cooliris.media (pid 9684) has died.
07-29 16:17:34.150: I/ActivityManager(145): Process com.android.huawei.projectmenu (pid 9727) has died.
07-29 16:17:44.010: I/ActivityManager(145): Process com.android.defcontainer (pid 9794) has died.

Helfen diese Loggings weiter bzgl. was meine App Speicher braucht?
07-29 16:16:38.070: D/dalvikvm(9877): GC_CONCURRENT freed 246K, 50% free 3025K/5959K, external 0K/0K, paused 8ms+5ms
07-29 16:19:39.840: D/dalvikvm(9877): GC_FOR_MALLOC freed 356K, 52% free 3058K/6343K, external 0K/0K, paused 112ms

Antworten
  • Forum-Beiträge: 38

02.08.2012, 08:14:45 via Website

Der Vollständigkeit halber - und für alle die das gleiche Problem haben wie ich - eine Lösungsmöglichkeit.
Der Service muss als Foreground-Service definiert werden: Android Developers

Mein beschriebenes Problem mit dem "Aufruf der GMX-Startseite" wird hier auch angesprochen:
... system needs to kill them to reclaim more memory (such as to display a large page in a web browser),...

Eine (für mich schöne) "Nebenwirkung" hat das der Foreground-Service:
Nachdem ein Service immer im Hauptprozess einer App läuft, erhält somit nicht nur der Service, sondern gleich die ganze App den Zustand "Foreground".

Es wird damit - auch die App - nicht mehr von Android abgeschossen. Das bezieht sich auch auf weitere "normale" Services, die in der App laufen (ob das Sinn macht ist ein anderes Thema..?). Ab dem Zeitpunkt, ab dem in einer App ein Foreground-Service läuft, werden auch "normale" Services der App nicht mehr beendet :-)

cu
Chris

Antworten