2013-09-04 7 views
1

Я использовал диспетчер аварийных сигналов, чтобы пользователь мог планировать выполнение определенной задачи за определенное время. В контексте приложения у меня есть игра для Android, в которой люди могут планировать, когда отправлять свои корабли. Менеджер сигнализации работает нормально, сигнализация получить стартовало в нужное время и т.д.Использование службы Intent в сочетании с диспетчером аварийных сигналов

Что происходит, когда сигнал тревоги выпалил (обычно каждый час и немного), является то, что мой IntentService начнет связь с сервером отправлять корабли. Это действие может занять 1 минуту, но это может продолжаться до 10 минут. Даже все это прекрасно работает. Сигнализации увольняются, корабли отправляются, все счастливы. Проблема возникает ночью, я ложись спать и ожидаю, когда проснусь, что мои корабли отправлены всю ночь напролет. Неа. Журналы & показывают, что аварийные сигналы запускаются правильно, но кажется, что IntentService убит, когда он общается с сервером.

Возможная причина этого заключается в том, что я не смотрю на игру каждый раз в то время, как я, когда я просыпаюсь, и тем самым сохранить некоторую форму процесса бега, который предотвращает IntentService от сборщиком мусора ,

Я уже пробовал много вещей, чтобы исправить это. Раньше я работал с BroadCastReceiver, я использовал для создания ASyncTasks в IntentService, но с тех пор я обновил свой код, чтобы больше не использовать эти вещи, поскольку они являются плохой практикой для Сервисов.

Я также проверял этот ресурс: http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html, но я все еще не уверен, что то, что я делаю, является правильной вещью, чтобы справиться с этой ситуацией. Я поместил некоторые обширные регистрации на следующую ночь, чтобы рассмотреть утром, но я бы хотел, чтобы вы, ребята, высказались по этому поводу.

О, я также с просьбой о WakeLock для полной продолжительности функции onHandleIntent с помощью:

PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE);           
this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "MyApplicationWakeLock"); 

Мой IntentService:

public class ScheduledRequestService extends IntentService { 

    public ScheduledRequestService() { 
     super("ScheduledRequestService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startID){ 
     Logger.d("OnStartCommand!"); 
     return super.onStartCommand(intent, flags, startID); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     ScheduledRequest request = (ScheduledRequest) intent.getExtras().getSerializable("request"); 
     // This function will start a lot of client <-> server communication 
     request.onExecute(this, intent); 
    } 

    @Override 
    public void onDestroy(){ 
     Logger.d("OnDestroy!"); 
     super.onDestroy(); 
    } 
} 

Так опять же, мой вопрос; Я правильно структурирую это? Должен ли я использовать обычный Сервис вместо IntentService? Может ли мой IntentService получить сбор мусора, пока он обрабатывает Intent (я думаю, что я читал, что это возможно)?

ответ

0

Оказывается, ошибка была где-то еще, чем сборщик мусора Android. Я использовал кеш, который в конечном итоге привел к тому, что я «закончил корабли», потому что в момент отправки он вычитал отправленное количество судов из пула. Однако, когда они вернулись, они никогда не добавлялись в кеш. В течение дня я, вероятно, вручную обновил кеш или заставил Android очистить его, используя мой телефон, иначе это не вызвало бы проблему (столько же).

1

Может ли мой IntentService получить мусор, собранный во время обработки намерения (я думаю, что прочитал, что это возможно)?

Нет, но ваш процесс может быть прекращен.

Я правильно структурировал это?

Нет, если вы пытаетесь использовать сигнализацию _WAKEUP. В этом случае вам нужно установить более тщательно, и я бы рекомендовал либо WakefulBroadcastReceiver, либо my WakefulIntentService для обработки этого шаблона.

Должен ли я использовать обычную Службу вместо IntentService?

Нет, IntentService будет в порядке. Возможно, вам стоит подумать о том, чтобы сделать его передним, используя startForeground().

+0

Если мой IntentService не может быть собран в мусор, когда он обрабатывает намерение, он должен быть чем-то другим, что мешает Intent правильно выполнять всю свою работу. Что означает сигнализация «_WAKEUP»? Я попробую сделать его передним планом, посмотрим, что это делает. Спасибо за предложение. – Wotuu

+0

@Wotuu: Как я уже писал, ваш процесс может быть прекращен. – CommonsWare

+0

Все может быть убито, за исключением запущенных служб, если процесс завершен, а мои службы будут прекращены, поэтому мне нужно как-то предотвратить это. – Wotuu

Смежные вопросы