在单独的线程中关闭CameraDevice

时间:2018-08-22 19:17:41

标签: multithreading performance android-camera2

我正在使用Android camera2创建自定义相机。 cameraDevice.close()方法很慢,它会使UI冻结1秒钟。我把它放在另一个线程中,它似乎工作正常。我想知道这是否会引起一些严重的问题,以及是否还有另一种方法可以解决此问题。这是我的closeCamera方法:

public function beforeValidationOncreate()
{
    //This makes sure the createdAt field gets the timestamp
    parent::initialize();

    //Other custom operations
    $this -> active = 'Y';
}

我认为当mCameraDevice尚未关闭但用户再次打开相机时,可能会导致崩溃。但这是极少数情况,我想在再次打开相机之前再进行一次检查。我不希望UI冻结1秒以使其关闭,除了将其放在单独的线程中之外,还有其他方法可以实现吗?

2 个答案:

答案 0 :(得分:1)

正如Alex Cohn所提到的,建议的做法是在与UI分开的线程上完成所有与相机相关的工作。

相对而言,打开相机或创建捕获会话也需要很长时间,因此不在UI线程上执行这些操作也是一个好主意。

也就是说,只要您不丢失自己的应用程序状态(例如,不要尝试使用已经意外关闭的摄像头设备),就没有理由可以不要混用对摄像头设备的呼叫,也不能从多个线程捕获会话。这些类本身是线程安全的。

答案 1 :(得分:0)

据我所知,cameraDevice.close()的这种冻结发生在某些不幸的设备上,有时可以通过执行常规系统升级来解决。

但是,如果这发生在您的设备上,这有点安慰。实际上,您很幸运可以为此准备一个修复程序。您的应用的最终用户将从您的不幸中受益。

如果您的代码可以为您提供所需的改进,则您的代码看起来不错。正如我所解释的,可能很难在另一个设备上重现此问题。

我宁愿将所有closeCamera()逻辑放在同一后台线程上。如果您为 openCamera()提供了 Handler ,则为in the official example

manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);

然后我建议将所有closeCamera()序列发布到此 mBackgroundHandler