gpt4 book ai didi

android - 使用 AsyncTask 打开相机

转载 作者:太空狗 更新时间:2023-10-29 14:20:22 24 4
gpt4 key购买 nike

我想按照此处的建议使用 AsyncTask 打开相机 http://developer.android.com/reference/android/hardware/Camera.html#open%28int%29 :

Caution: On some devices, this method may take a long time to complete. It is best to call this method from a worker thread (possibly using AsyncTask) to avoid blocking the main application UI thread.

所以像这样:

onResume(){
new AsyncTask(){
doItInBackground(){
camera_ref = Camera.open();
}
}.execute();
}

然后在 Pause() 中我必须释放相机:

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

问题:我能做些什么来确保 open() 在 release() 之后永远不会被调用?将 open() 放在带有 bool 变量的同步块(synchronized block)中不应是解决方案,因为这仍会阻塞 UI 线程。

一般来说,这个问题适用于我在回调方法中调用 camera_ref.something() 的所有情况...因为我必须确保这个调用只发生在 open() 和 release() 之间,而回调方法可以是每时每刻都从 UI 线程调用。

可能我遗漏了什么。我想看看它应该如何完成。

编辑:截至目前,我认为最好的解决方案可能是使用此处所述的 IntentService:http://developer.android.com/guide/components/services.html .特别是:

The IntentService does the following:

- Creates a default worker thread.
- Creates a work queue that passes one intent at a time.

这就是我要找的。使用 AsyncTask.executeOnExector(SINGLE_EXECUTOR) 是不可行的,因为 AsyncTasks 甚至可能在开始之前就被杀死。我将进一步研究 ThreadPoolExecutor,看看它是否是一个可能的替代方案。

最佳答案

Question: What can I do to be sure that open() will never be called after release()? Putting open() inside a synchronized block with a boolean variable shouldn't be a solution since this would still block the UI thread.

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

编辑:我的第一个答案是错误的:[

关于android - 使用 AsyncTask 打开相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17614503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com