AlarmManager блокирует основной поток - PullRequest
2 голосов
/ 13 марта 2012

Я реализовал AlarmManager, который вызывает Сервис.Проблема в том, что, хотя я запускаю его в AsyncTask, он блокирует основной поток.Это источник моей AsyncTask:

private class NotificationsServiceTask extends AsyncTask<Void, Void, Void> {
    private AlarmManager alarmMgr;
    private PendingIntent pi;

    @Override
    protected Void doInBackground(Void... params) {
        alarmMgr = (AlarmManager) LoginActivity.this.getSystemService(Context.ALARM_SERVICE);
        Intent serviceIntent = new Intent(LoginActivity.this, Service.class);
        pi = PendingIntent.getService(LoginActivity.this, 0, serviceIntent, 0);
        alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 120000, pi);
        return null;
    }


    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
    }
} 

Мне нужно сделать это асинхронно, потому что это блокирует мой основной поток.

Ответы [ 2 ]

7 голосов
/ 13 марта 2012

Неважно, что вы установили будильник в AsyncTask.Диспетчер аварийных сигналов всегда запускает ваш сервис в главном потоке, потому что так работают сервисы.

Чтобы решить вашу проблему, вам нужно будет изменить службу, для которой сигнализация начинает создавать AsyncTask для запуска.

0 голосов
/ 13 марта 2012

Я знаю, что они не были фермой ссылок, но Commonsguy написал WakeFullIntentService

Он скрывает это, используя приемник тревоги. прекрасно работает, стоит проверить. Это будет ставить в очередь запросы от вашего приемника тревоги, работать в фоновом режиме и пробуждать устройство, пока оно работает в отдельном потоке.

...