Android 正确释放用于Camera2重复请求的目标曲面
假设我有Android 正确释放用于Camera2重复请求的目标曲面,android,camera,android-camera,android-camera2,Android,Camera,Android Camera,Android Camera2,假设我有CameraCaptureSession session1和Surface s1作为重复CaptureRequest的目标。现在我想更改输出大小。为此,我可以创建另一个具有适当大小的曲面s2,并创建另一个CameraCaptureSession session2。 现在我将使用s2作为未来CaptureRequests的目标,因此我不再需要s1。此外,我只想在发布s1之后创建s2,这样我就可以节省资源 确切地说,s1何时可以发布?我可以在session1.close()之后立即释放s1,
CameraCaptureSession session1
和Surface s1
作为重复CaptureRequest
的目标。现在我想更改输出大小。为此,我可以创建另一个具有适当大小的曲面s2
,并创建另一个CameraCaptureSession session2
。
现在我将使用s2
作为未来CaptureRequests
的目标,因此我不再需要s1
。此外,我只想在发布s1
之后创建s2
,这样我就可以节省资源
确切地说,s1
何时可以发布?我可以在session1.close()
之后立即释放s1
,还是应该等到触发onClosed(Session)
后才释放s1
第二种方法听起来很正确,但我发现的
replaceSessionClose()
让我有点困惑。最好等待onClosed,尽管在最坏的情况下,您会错过发送到旧会话的一到两个帧,并且如果您提前释放surface,在logcat中会有一些错误记录
但这不会导致创建新会话失败。感谢您的回答我是否理解正确:我为早期发布支付的最高价格是丢失的帧和logcat消息,因此如果我对这些帧不感兴趣,那么在
会话后立即发布曲面是完全安全的。close()
并且不会发生运行时错误?如果您已将会话中最后一个请求的CaptureCallback#onCaptureFailed方法()与释放的曲面连接起来,则可能会调用该方法的某些实例,因为在无缓冲区可发送的情况下无法处理请求,但不应发生其他错误。