0

アラームを使用して、定期的に写真を撮ります。次のように BroadcastReceiver を使用します。

@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();
}

capturePicture()呼び出しがCamera.takePicture(...)終了します。最後に、ご覧のとおり、wl.release()が呼び出されます。

さて、問題は、takePicture私の場合、のコールバックに非常に時間がかかることです。実際、撮影したばかりの写真に対していくつかの操作を実行しますが、これには私のデバイスで最大 5 秒かかることがあります。

私の質問は、wl.release()takePicture コールバックへの計算集約型タスクが実行されている間に呼び出されるため、副作用はありますか? つまり、デバイスがスタンバイ モードにあるとします。アラームが開始されます --> ウェイクロックがアクティブになります --> 写真が撮影され、操作されますが、その間に計算ウェイクロックが解放されます...安全ですか、それともルーチンが開始される前にデバイスがスタンバイモードに戻るリスクがありますtakePicture コールバックは終了しますか?

4

1 に答える 1

2

レシーバーで多くのことを行うべきではないという点と、とにかく実行AlarmManager中にウェイクロックを保持するという点で、セットアップが間違っています-はい、編集中にウェイクロックを解放しないでください。サービスに委任する必要があります。ここで説明する理由により、これはWakefulIntentServiceである必要があります。そのサービスでは、処理が完了するのを待つためのメカニズムを設定する必要があります-おそらくCountDownLatchを使用します。onReceive()

于 2014-01-14T11:19:48.760 に答える