2012-03-29 3 views
3

J'ai un service qui est également LocationListener. Lors d'un nouvel événement de localisation, il réalise une sorte de réseau qui peut prendre du temps; C'est pourquoi il est implémenté en tant que AsyncTask.Processus est mort/Planification redémarrage du service écrasé

Souvent, je vois dans le journal sur le périphérique réel:

03-29 17:02:20.847 D/dalvikvm( 235): GC_FOR_ALLOC freed 961K, 29% free 10234K/14215K, paused 26ms 
03-29 17:02:20.855 I/DemoService( 555): DiyScheduer.onStart 
03-29 17:02:20.855 I/ggheart ( 555): onStart 
03-29 17:02:21.097 V/PhoneStatusBar( 235): setLightsOn(true) 
03-29 17:02:21.121 W/IInputConnectionWrapper(11244): showStatusIcon on inactive InputConnection 
03-29 17:02:21.277 I/ActivityManager( 161): Process android.process.media (pid 11298) has died. 
03-29 17:02:22.058 I/ActivityManager( 161): Process com.idavydov.myapp (pid 11051) has died. 
03-29 17:02:22.066 I/WindowManager( 161): WIN DEATH: Window{41b05850 com.idavydov.myapp/com.idavydov.myapp.MyActivity paused=false} 
03-29 17:02:22.074 W/ActivityManager( 161): Scheduling restart of crashed service com.idavydov.myapp/.MyService in 5000ms 

Habituellement, il arrive après une grande application est chargée.

La raison de ce manque de mémoire? Dans ce cas pourquoi il n'y a pas un tel type de message dans le journal?

P.S. Dans une autre question, j'ai vu l'explication que la raison est que la tâche prend trop de temps. Mais j'ai ajouté le code suivant à mon AsyncTask et je n'ai pas pu reproduire le crash dans l'émulateur.

protected Boolean doInBackground(...) { 
     ... 
     long time = System.currentTimeMillis(); 
     while (System.currentTimeMillis() - time < 11 * 1000); 
     .... 
    } 

Merci

+0

Votre processus meurt chaque fois que vous exécutez votre doInBackground? – Orest

+0

Non. Seulement parfois. –

Répondre

1

Je pense que vous mélanger deux choses. Android ne permet pas de bloquer le fil de l'interface utilisateur, et il va tuer votre application si c'est le cas. Sauf si vous mettez le traitement de blocage et les boucles dans le processus en arrière-plan de AsyncTask. A côté de cela, android va tuer votre application sans aucun avertissement quand il a peu de mémoire ou il identifie que votre application n'a aucun effet sur l'utilisateur. Si vous souhaitez que votre application reste plus longtemps, vous avez besoin d'un service fixe et d'une bonne gestion du cycle de vie des applications.

+0

Existe-t-il un moyen d'identifier la raison pour laquelle le service a été tué? –

+0

@IakovDavydov peut-être si vous obtenez un journal de l'appareil – Adrian

+0

Petit fragment est présenté dans la question. Mais je ne vois rien de lié à mon service à cette époque. –

Questions connexes