ここで提案されているように、 AsyncTask を使用してカメラを開きたい http://developer.android.com/reference/android/hardware/Camera.html#open%28int%29 :
注意: 一部のデバイスでは、この方法が完了するまでに時間がかかる場合があります。メイン アプリケーションの UI スレッドをブロックしないように、ワーカー スレッドから (おそらく AsyncTask を使用して) このメソッドを呼び出すことをお勧めします。
次のようなものです:
onResume(){
new AsyncTask(){
doItInBackground(){
camera_ref = Camera.open();
}
}.execute();
}
次に、Pause() でカメラを解放する必要があります。
onPause(){ if(camera_ref!=null) camera_ref.release(); }
質問: open() が release() の後に呼び出されないようにするにはどうすればよいですか? ブール変数を使用して同期ブロック内に open() を配置しても、UI スレッドがブロックされるため、解決策にはなりません。
一般に、この問題は、コールバック メソッド内で camera_ref.something() を呼び出すすべての状況に当てはまります。あらゆる瞬間の UI スレッド。
おそらく私は何かが欠けています。やり方を見てみたいです。
編集:今のところ、最善の解決策は、ここで説明されているように IntentService を使用することだと思います: http://developer.android.com/guide/components/services.html。特に:
IntentService は次のことを行います。
- Creates a default worker thread.
- Creates a work queue that passes one intent at a time.
それが私が探していたものです。AsyncTask.executeOnExector(SINGLE_EXECUTOR) の使用は、AsyncTasks が開始前に強制終了される可能性があるため、実行できません。ThreadPoolExecutor をさらに調べて、それが可能な代替手段であるかどうかを確認します。