什么时候TextureView的“消费者一方”closures?

Camera2 API的官方Google样本之一遭受相同的BufferQueue has been abandoned问题 ,如下所示:

  • BufferQueue被放弃后我能做什么?
  • Android LogCat显示BufferQueueProcedure

具体来说,示例应用程序从片段的onPause()调用closeCamera()方法,其中closeCamera()closeCamera()调用close() ,然后在CameraDevice上调用close() ,然后在ImageReader上调用close()拍照)。 CameraDevice上的close() BufferQueue has been abandoned在LogCat中出现了上述BufferQueue has been abandoned出现的一些消息之后,虽然我只在一些Android 5.1硬件(Nexus 4和Nexus 7 2013)上获得了消息,而不是其他人(Nexus 5和Nexus 6)。

法登对此的评论是:

如果在进入onPause()之前消费者端被closures,则消息将被预期。

TextureView的“消费者端”什么时候会closures,为什么呢?

Google的示例代码不会主动做任何事情来closures我可以看到的TextureView 。 而且,由于TextureView在暂停时仍然可见,所以我期望在onPause() ,“消费者端”不会受到影响,但是可能在onStop()后面。

虽然我意识到这个消息(尽pipe是一个错误)是良性的,我试图找出如何摆脱它,如果没有其他的原因,而不是防止我一再被问及为什么我的代码是logging这个错误。 我希望通过更多地了解这个“消费者方”,我可以弄清楚在用户退出使用Camera2的活动或片段时如何更好地整理,避免这种错误。

Solutions Collecting From Web of "什么时候TextureView的“消费者一方”closures?"

在退出onPause之前是否正在等待摄像机的onClosed状态callback方法被调用?

在callback触发之前,相机可能还有待处理的工作要做,而close()的定义是在closures设备之前完成所有未决的捕获请求。 在调用close()之前,可以通过调用abortCapture()来加速。

有些设备(如N5和N6)目前阻塞了close()调用,所以当它返回时,所有未完成的工作都完成了,但这是我认为我们的示例在今天无意中依赖的实现细节。

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

换句话说,close()应该是asynchronous的,并不在所有的设备上。 但是我们希望它可以让你开火并忘记它,所以这些错误信息需要在摄像机设备的一端进行处理(而不是在重复请求目标在中途运行时消除垃圾信息)。

另一个只是调用close()并退出onPause()的原因现在不推荐使用,因为它会阻止其他应用程序在其onResume()调用中打开相机,在相机应用程序之间切换时会导致虚假错误。

所以总结一下:

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

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

至于实际的问题 – “什么时候是一个TextureView的”消费者方“closures”,我不知道确切的时间,但肯定是在onPause返回之后。

大致上,TextureView包含一个GL表面,一旦活动的UI不再可见,这些资源就会被拆除。 一旦发生这种情况,由TextureView给出的SurfaceTexture将不再有效,并且该SurfaceTexture(或由其生成的曲面)的任何现有用户都将开始接收这些错误。 TextureView.SurfaceTextureListener.onSurfaceTextureDestroyed方法应该在TextureView调用之前发生。

所以作为一种select,你可能会从onSurfaceTextureDestroyed返回false,以避免在UI拆卸过程中被释放,而是等待onClosed触发,然后在onClosed中释放TextureView的SurfaceTexture。 然而,我并不十分熟悉事物的UI / View方面,因为这肯定会起作用,并且由于某些底层本地表面是以任一方式发布的,所以您仍然可以看到这种方法抛弃了错误。

如果您好奇,相关代码的顶层是在TextureView中 ,尤其是destroySurface方法,尽pipe在调用destroySurface方法时需要了解整个Android UI系统,它的影响是什么。