我想使用AsyncTask按照此处的建议打开相机 http://developer.android.com/reference/android/hardware/Camera.html#open%28int%29:
注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用AsyncTask)调用此方法,以避免阻塞主应用程序UI线程。
类似于:
onResume(){
new AsyncTask(){
doItInBackground(){
camera_ref = Camera.open();
}
}.execute();
}
然后在暂停()我必须释放相机:
的onPause(){ 如果(camera_ref!= NULL) camera_ref.release(); }
问题:我可以做些什么来确保在release()之后永远不会调用open()? 将open()放在带有布尔变量的synchronized块中不应该是一个解决方案,因为这仍然会阻止UI线程。
一般来说,这个问题适用于我在回调方法中调用camera_ref.something()的每种情况......因为我必须确保此调用仅在open()和release()之间发生,而回调方法可以是在每个时刻都从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,看看它是否可能是替代方案。
答案 0 :(得分:1)
问题:我可以做些什么来确保在release()之后永远不会调用open()?将open()放在带有布尔变量的synchronized块中不应该是一个解决方案,因为这仍然会阻止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(); }
编辑:我的第一个回答是错的:[