BufferQueue has been abandoned
problem的看法:
> What can I do when the BufferQueue has been abandoned?
> Android LogCat shows BufferQueueProcedure
具体来说,示例应用程序从片段的onPause()调用closeCamera()方法,其中closeCamera()在CameraCaptureSession上调用close(),然后在CameraDevice上关闭close(),然后在ImageReader上关闭()(用于实际拍照).在CameraDevice上关闭()之后,当前几次出现的BufferQueue已经被放弃的消息出现在LogCat中,尽管我只收到一些Android 5.1硬件(Nexus 4和Nexus 7 2013)上的消息,而不是其他(Nexus 5和Nexus 6).
法登对此的评论是:
If the consumer side is shut down before entering onPause(),the messages would be expected.
什么时候TextureView的“消费者端”将被关闭,为什么呢?
Google的示例代码并没有主动地做任何事情来关闭我可以看到的TextureView.而且,由于TextureView在暂停时仍然可以看到,所以我预计在“onPause()”时可能不会影响“消费者端”,但也可能在onStop()之后).
虽然我意识到这个消息(尽管是一个错误)是良性的,但我试图找出如何摆脱它,如果没有其他原因,以防止我被问到一次又一次为什么代码我正在记录这个错误.我希望通过更多地了解这个“消费者方面”,我可以弄清楚当用户退出使用Camera2的活动或片段时,如何更好地整理,避免出现此错误.
解决方法
在该回调触发之前,相机可能仍然有待处理的工作要做,close()的定义是在关闭设备之前完成所有挂起的捕获请求.这可以在调用close()之前调用abortCapture()来加速.
某些设备(如N5和N6)目前阻止close()调用,以便在返回时,所有待处理的工作都完成,但这是一个实现细节,我认为我们的示例无意中依赖于今天.
然而,我们通常希望允许应用程序调用close()并立即离开onPause(),以避免挂起UI线程等待相机硬件关闭.但今天还不是现实.
换句话说,close()应该是异步的,而不是在所有的设备上.但是,我们希望您能够启动并忘记它,因此这些错误消息需要在相机设备的一侧进行解决(当重复的请求目标在中间操作时,不是垃圾邮件的日志).
另一个原因只是调用close()和退出onPause(),今天不建议它会阻止其他应用程序打开
相机在其onResume()调用中,这将在相机应用程序之间切换时导致错误的错误.
所以总结一下:
现在:在调用CameraDevice#close()之后,等待CameraDevice.StateCallback#onClosed被调用,然后退出onPause().
在将来的某个时刻:可以安全地调用close()并退出onPause;该框架将正确地允许下一个应用程序连接,而不是垃圾邮件您的日志.对不起,这不是今天的状态!