3

ここで提案されているように、 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 をさらに調べて、それが可能な代替手段であるかどうかを確認します。

4

1 に答える 1

1

質問: open() が release() の後に呼び出されないようにするにはどうすればよいですか? ブール変数を使用して同期ブロック内に open() を配置しても、UI スレッドがブロックされるため、解決策にはなりません。

onResume() は非同期で open() を呼び出し、onPause() は release() を呼び出すため、理論上、Activity がすばやく開いて閉じた場合、release() を呼び出してから open() を呼び出す可能性があるという懸念があります。[isFinishing]1 を使用します。

onResume(){
    release = false;
    new AsyncTask(){
        doItInBackground(){
            if (!isFinishing())
                camera_ref = Camera.open();
        }
    }.execute();
}

onPause(){ if(camera_ref!=null) camera_ref.release(); }

編集:私の最初の答えは間違っていました:[

于 2013-07-12T18:43:27.113 に答える