Процесс умер / Планирование перезапуска аварийного сервиса - PullRequest
3 голосов
/ 29 марта 2012

У меня есть сервис, который также является LocationListener. При новом событии локации он выполняет какие-то сетевые действия, которые могут занять время; поэтому он реализован как AsyncTask.

Часто вижу в логе на реальном устройстве:

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

Обычно это происходит после загрузки большого приложения.

Является ли причиной этого недостатка памяти? В таком случае, почему в журнале нет такого сообщения?

P.S. В другом вопросе я видел объяснение, что причина в том, что задача занимает слишком много времени. Но я добавил следующий код в свой AsyncTask и не смог воспроизвести сбой в эмуляторе.

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

Спасибо

1 Ответ

1 голос
/ 30 марта 2012

Я думаю, что вы смешиваете две вещи. Android не позволяет блокировать поток пользовательского интерфейса, и в этом случае он убьет ваше приложение. Если вы не включили обработку блокировки и циклы в фоновый процесс AsyncTask.

Кроме того, android убьет ваше приложение без предупреждения, если у него мало памяти или если оно определяет, что ваше приложение не влияет на пользователя. Если вы хотите, чтобы ваше приложение оставалось дольше, вам понадобится липкая служба и хорошее управление жизненным циклом приложения.

...