android – 当TextureView的“消费者端”何时关闭?

One of the official Google samples for the Camera2 API遭受 the same 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的活动或片段时,如何更好地整理,避免出现此错误.

解决方法

您是否等待相机的onClosed状态回调方法调用,然后退出onPause?

在该回调触发之前,相机可能仍然有待处理的工作要做,close()的定义是在关闭设备之前完成所有挂起的捕获请求.这可以在调用close()之前调用abortCapture()来加速.

某些设备(如N5和N6)目前阻止close()调用,以便在返回时,所有待处理的工作都完成,但这是一个实现细节,我认为我们的示例无意中依赖于今天.

然而,我们通常希望允许应用程序调用close()并立即离开onPause(),以避免挂起UI线程等待相机硬件关闭.但今天还不是现实.

换句话说,close()应该是异步的,而不是在所有的设备上.但是,我们希望您能够启动并忘记它,因此这些错误消息需要在相机设备的一侧进行解决(当重复的请求目标在中间操作时,不是垃圾邮件的日志).

一个原因只是调用close()和退出onPause(),今天不建议它会阻止其他应用程序打开
相机在其onResume()调用中,这将在相机应用程序之间切换时导致错误错误.

所以总结一下:

现在:在调用CameraDevice#close()之后,等待CameraDevice.StateCallback#onClosed调用,然后退出onPause().

在将来的某个时刻:可以安全地调用close()并退出onPause;该框架将正确地允许下一个应用程序连接,而不是垃圾邮件您的日志.对不起,这不是今天的状态!

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...