Android相机:线程?哪个应该做什么

时间:2015-05-12 20:19:14

标签: java android multithreading camera

我想弄清楚哪些线程应该在Android中做什么。

我在官方文档中发现的唯一内容是camera.open()应该放在自己的主题中。

怎么样:

  • camera.startPreview()
  • camera.stopPreview()
  • camera.release()

它没有说明他们需要哪个线程。它们必须在主线程(ui线程)上运行吗?或者我可以自由选择吗?

为什么我要弄清楚这一点? camera.startPreview()在主线程上运行导致我的应用程序在短时间内抖动/滞后,这会严重影响我的应用程序,因为它放在viewPager中,我不希望让相机始终预览(这不会导致延迟,但会占用系统资源)。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

Camera的文档声明该类不是线程安全的,并且应该一次从多个线程调用 (我想,除非您正在执行自己的同步)。< / p>

它表示回调将被传递给调用open的线程

从参考文献(强调我的):

  

此类不是线程安全的,,适用于一个事件线程。大多数长时间运行的操作(预览,焦点,照片捕获等)都是异步发生的,并在必要时调用回调。将在调用事件线程open(int)时调用回调。绝不能一次从多个线程调用此类的方法。

来自open(int)方法参考:

  

来自其他方法的回调被传递到调用open()的线程的事件循环。如果此线程没有事件循环,则回调将传递到主应用程序事件循环。如果没有主应用程序事件循环,则不会传递回调。

     
    

注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用AsyncTask)调用此方法,以避免阻塞主应用程序UI线程。

  

所需的主题是您用来调用open(int)的主题。

所以回答你的问题,是的你可以相对自由选择,但你必须保持一致。