gpt4 book ai didi

android - TextureView 的 "Consumer Side"何时关闭?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:01 25 4
gpt4 key购买 nike

One of the official Google samples for the Camera2 API患有the same BufferQueue has been abandoned problem如下所示:

具体来说,示例应用调用 closeCamera()方法来自 onPause()一个 fragment ,其中 closeCamera()电话 close()CameraCaptureSession 上, 然后 close()CameraDevice 上, 然后 close()ImageReader 上(用于实际拍照)。 close()之后在 CameraDevice是当上述BufferQueue has been abandoned出现几次时消息出现在 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 的 Activity 或 fragment 时如何更好地整理并避免此错误。

最佳答案

在退出onPause之前,是否在等待调用相机的onClosed状态回调方法?

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

某些设备(如 N5 和 N6)目前会阻止 close() 调用,因此当它返回时,所有待处理的工作都已完成,但我认为这是我们的示例今天无意中依赖的实现细节。

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

换句话说,close() 应该是异步的,并不是在所有设备上。但我们希望您可以触发并忘记它,因此需要在相机设备端解决这些错误消息(当重复请求目标在操作中途消失时,不要向日志发送垃圾邮件)。

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

总结一下:

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

在未来的某个时候:调用 close() 并退出 onPause 是安全的;该框架将正确地允许下一个应用程序连接并且不会向您的日志发送垃圾邮件。抱歉,今天不是这个状态!

关于android - TextureView 的 "Consumer Side"何时关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com