2014-01-14 2 views
0

Я использую будильник, чтобы делать снимки с регулярными интервалами времени. Я использую BroadcastReceiver следующим образом:Поведение PowerManager и PARTIAL_WAKE_LOCK

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Log.d(TAG, "Capturing pic"); 

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CAPPIC"); 
    wl.acquire(); 

    capturePicture(); 

    wl.release(); 
} 

The capturePicture() звонки Camera.takePicture(...), а затем завершается. Наконец, как вы можете видеть, вызывается wl.release().

Проблема в том, что обратный вызов takePicture занимает очень много времени в моем случае. Фактически, он выполняет некоторые манипуляции на только что снятой картинке, которая может занять до 5 секунд на моем устройстве.

Вопрос, так как wl.release() вызывается, когда вычислительная интенсивная задача выполняется в обратном вызове takePicture, есть ли побочный эффект? То есть, предположим, что устройство находится в режиме ожидания. Начинается тревога -> активируется wakelock -> снимается и обрабатывается изображение, но в то же время выдается рассылка wakelock ... безопасно или существует риск того, что устройство вернется в режим ожидания до того, как процедуры завершается обратный вызов takePicture?

ответ

2

Ваша установка плохого в том, что вы не должны делать много в приемнике и в том, что AlarmManager держит wakelock то время как onReceive() бежит все равно - и да, вы не должны освободить wakelock при редактировании. Вы должны делегировать услугу, и по причинам, указанным в here, это должно быть WakefulIntentService. Теперь в этой службе вы должны настроить механизм ожидания завершения обработки - возможно, используя CountDownLatch.

+0

Большое спасибо @Mr_and_Mrs_D за ваше предложение ответа. Но что касается кода, о котором я сообщал в своем сообщении, как долго процессор будет продолжать работать после 'release()'? Я имею в виду, предположим, что устройство находится в режиме ожидания, затем запускается будильник и используется «PowerManager.PARTIAL_WAKE_LOCK». Исходя из этого, из документации API я прочитал: «Если вы удерживаете частичную блокировку слежения, процессор будет продолжать работать независимо от любых тайм-аутов дисплея или состояния экрана и даже после нажатия пользователем кнопки питания». _, но когда вызывается 'release()', устройство возвращается в режим ожидания мгновенно? – user2923045

+0

Мой вопрос, потому что мое приложение прекрасно работает, когда устройство подключено к источнику питания, но оно не работает (время от времени), когда устройство работает с батареями ... – user2923045

+0

Ваш wakelock в onReceive ничего не делает. AlarmManager держит его для вас во время onReceive. Вы должны использовать WakefulIntentService в качестве ответа в моем ответе. Там вам нужно дождаться завершения обработки (я не знаю, как - задайте другой вопрос). Пока вы ждете в WIS, вы в безопасности - WIS имеет блокировку слежения. Ожидается отказ от батарей, а не отказ от питания - в батареях он не спит как можно скорее –

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

  • Нет связанных вопросов^_^