【问题标题】:Android camera running on AsyncTask在 AsyncTask 上运行的 Android 相机
【发布时间】:2013-11-18 16:13:00
【问题描述】:

有人有这种“东西”的工作样本吗?

理论上,以这种方式实现它是个好主意,但我没有看到任何相关的代码显示如何实现它。

我不想要任何花哨的东西,越简单越好。我只想在单独的线程上实现与相机控制相关的所有内容。

谢谢

[编辑]

更具体:就像official documentation 声明的那样,“访问相机的推荐方法是在从 onCreate() 启动的单独线程上打开相机”。因此,我需要的是扩展 AsyncTask 的 CameraPreview 类的最小实现(我假设)。

【问题讨论】:

  • 你能再具体一点吗?

标签: android android-asynctask camera android-camera


【解决方案1】:

您的报价是 IIRC,不完整。建议是 将 camera.open() 卸载到辅助线程有两个原因。一是 open() 本身在某些设备上很慢。但是相机回调仍然会到达主线程。

如果您不想在 UI 线程上接收相机回调,您应该在单独的事件线程上打开相机(强调我的)。事件线程也称为 Looper 线程。

因此,AsyncTask 在这里无能为力。有关工作示例,请参阅https://stackoverflow.com/a/19154438/192373

【讨论】:

  • 在给定的示例中,您等待Camera.open 完成,因此基本上这对“卸载到辅助线程”没有帮助,在非 UI Looper 上处理这些回调很好,但是有趣的部分是让相机在正确的时间打开/关闭,并正确处理surfaceChanged 事件。你能帮忙解决这些问题吗?
  • @TWiStErRob:我不确定我是否理解你的问题。不,在 UI 线程中没有“等待”相机完成 open()。该应用程序始终保持响应。我确实跳过了错误处理,在现实生活中,当surfaceDestroyed 在相机准备好之前发生时,你需要一些管道来处理这种情况。
  • mThread.openCamera 中发布Runnable 然后立即开始等待。当Camera.open 返回你notify 这个wait 时,它几乎等同于mThread.join()(在非Looper 世界中)。现在您调用 newOpenCamera 代替 UI 线程上的 oldOpenCamera,因此您在 UI Looper 中有一个正在阻塞的项目。
  • @TWiStErRob:现在我明白你的困惑了。我在the example 中开始的代码已经向openCamera() 启动了一个工作线程。它是从surfaceCreated() 启动的。当然,您可以直接使用 Looper,如果您预先正确规划系统,则可以避免使用额外的线程。
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多