我们是一群开发人员正在开发用于Android的实时视频处理应用程序.最近,一位客户报告我们的应用程序冻结仅在Nexus 10设备上发生.我们自己购买了设备并进行了测试:
有关冻结的更多信息:
我们的应用程序在onResume活动方法中打开相机,安装预览回调,为我们的处理需求设置最佳预览尺寸(在nexus 10这是1920x1080)并开始预览(如果从睡眠中恢复)或委托相同到SurfaceView的SurfaceView回调方法.在onPause方法中,我们的应用程序会删除预览回调,停止相机预览并释放相机.但是,我们的调查表明,该camera.release方法有时需要30秒才能完成.在那30秒内,我们的应用程序被冻结,因为我们曾经从UI线程控制相机.后来我们将相机控件移动到单独的事件处理程序线程,现在camera.release挂起该线程.虽然现在对用户来说这是不可见的(UI未被阻止),但是在我们的后台线程成功释放相机(即camera.release被叫后30秒)之前,用户无法使用任何应用程序中的相机.
在挂起期间,我们观察到来自摄像头服务的以下日志输出:
10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out …Run Code Online (Sandbox Code Playgroud)