Der Android-Dienst wird beendet

8

Ich bin zu dem Punkt gekommen, wo ich ein paar Schritte davon entfernt bin, kahl zu werden ...

Ich versuche, einen Dienst auszuführen, der prüft, ob die Server bei meiner Arbeit ausgeführt werden. Es sollte dies alle 5 Minuten tun.

Ich habe TimerTask, ScheduledExecutorService und schließlich Handler durchlaufen. Sie arbeiten alle ein paar Stunden "gut", bis auf einige Ungenauigkeiten, 1-5 Minuten aus und dann hört der "Timer" plötzlich auf zu feuern.

Nun, ich habe gelesen, dass der Scheduler stoppt, wenn er auf eine nicht abgefangene Exception stößt, und ich bin mir sicher, dass das auch bei der TimerTask der Fall ist - Aber beim Überprüfen der Log-Dateien gibt es überhaupt keine Ausnahmen. ..

Als ich heute von der Arbeit nach Hause kam, beschloss ich, ein Experiment mit Handler zu machen.

Ich habe 2 Handler erstellt, einer würde den Code für die Überprüfung der Server ausführen und einen int auf einmal inkrementieren. Der andere würde nur den Wert von besagtem int protokollieren, um nicht zu stoppen, sollte es eine Ausnahme (ich kann nicht sehen, wie es wäre) sehen.

Es läuft großartig, mit der üblichen 1-5 Minuten Ungenauigkeit, für ein paar Stunden und stoppt dann, unten sind die letzten Zeilen aus dem Protokoll:

%Vor%

Ich habe die letzten zwei Nachrichten zu meiner App nachgeschlagen und this thread - Aber ich kann nicht sehen, wie das in meinem Fall zutreffen würde.

Ich hoffe wirklich, dass ihr eine Ahnung davon habt, was ich falsch mache. Ich bin schon seit Wochen dabei. Versuche verschiedene Timer zu testen, versuche einen Timer zu bekommen, höre auf und starte ihn dann neu, aber ohne Glück, und wie mein letztes Experiment zeigt, scheint es nicht so zu sein ein Problem mit dem Timer .. ich denke ..

    
noir04 07.02.2011, 20:07
quelle

1 Antwort

14
  

Ich habe TimerTask, ScheduledExecutorService und schließlich Handler durchlaufen. Sie arbeiten alle ein paar Stunden "gut", bis auf einige Ungenauigkeiten, 1-5 Minuten aus und dann hört der "Timer" plötzlich auf zu feuern.

Natürlich. Keiner von denen sind für Ihren Zweck entwickelt, wie weder das Gerät wach halten, und beide nicht gut mit dem Android-Framework spielen. Einen Dienst im RAM 24x7 zu haben, nur um den Lauf der Zeit zu markieren, ist verschwenderisch, und Android wird aggressiver mit jeder vorübergehenden Veröffentlichung, indem es immerwährende Dienste wie diesen abschaltet.

Verwenden Sie AlarmManager , um Ihren Zeitplan und einen IntentService für die eigentliche Arbeit einzurichten. Der IntentService gibt Ihnen automatisch Ihren Hintergrund-Thread für Ihre Netzwerk-E / A, und er beendet den Dienst automatisch, wenn die Arbeit abgeschlossen ist.

Wenn Sie möchten, dass dies auch dann geschieht, wenn das Gerät einschläft, verwenden Sie einen _WAKEUP Alarm mit AlarmManager und meinen WakefulIntentService (oder etwas in dieser Richtung).

    
CommonsWare 07.02.2011, 20:35
quelle

Tags und Links