滚动进出视图时,TextureView isAvailable 偶尔为 false
TextureView isAvailable is occasionally false when scrolling into and out of view
我有一个 TextureView,它利用后台线程定期绘制内容。
这一切在大多数情况下都运行良好,但我发现当将此 TextureView 滚动出可见屏幕并重新打开时,有时会导致 isAvailable 为 false 且 lockCanvas 为 return null。我不知道这是关于快速滚动 into/out 视图的问题,还是其他问题。
我附加了一个 TextureViewListener 并且 onSurfaceTextureAvailable 确实被调用了 并且 isAvailable return 从那里是正确的。但是,当后台线程在此之后几毫秒尝试渲染时,isAvailable 为 false 且 lockCanvas returns 为 null,因此无法绘制。
有时将控件滚动回屏幕并再次回到视图可以解决问题,并且它会再次重新绘制。我在任何地方都找不到对这种特殊行为的解释,Stack Overflow 上似乎也没有其他问题可以解决这个问题。
这至少发生在 Android 7 和 9 的多台设备上。重现不是 100%,但经过多次尝试,总是会重现。
后台线程简单地循环这段代码:
Canvas c = null;
try {
synchronized (this) {
c = lockCanvas(null);
render(c); // <-- does some drawing when c is not null
}
} finally {
if (c != null) {
unlockCanvasAndPost(c);
}
}
我通过短暂延迟调用 requestLayout() 解决了这个问题。无论出于何种原因,即使调用了 onSurfaceTextureAvailable 并报告纹理可用,它也不会立即发生。稍微延迟请求新布局可解决此问题。
我有一个 TextureView,它利用后台线程定期绘制内容。
这一切在大多数情况下都运行良好,但我发现当将此 TextureView 滚动出可见屏幕并重新打开时,有时会导致 isAvailable 为 false 且 lockCanvas 为 return null。我不知道这是关于快速滚动 into/out 视图的问题,还是其他问题。
我附加了一个 TextureViewListener 并且 onSurfaceTextureAvailable 确实被调用了 并且 isAvailable return 从那里是正确的。但是,当后台线程在此之后几毫秒尝试渲染时,isAvailable 为 false 且 lockCanvas returns 为 null,因此无法绘制。
有时将控件滚动回屏幕并再次回到视图可以解决问题,并且它会再次重新绘制。我在任何地方都找不到对这种特殊行为的解释,Stack Overflow 上似乎也没有其他问题可以解决这个问题。
这至少发生在 Android 7 和 9 的多台设备上。重现不是 100%,但经过多次尝试,总是会重现。
后台线程简单地循环这段代码:
Canvas c = null;
try {
synchronized (this) {
c = lockCanvas(null);
render(c); // <-- does some drawing when c is not null
}
} finally {
if (c != null) {
unlockCanvasAndPost(c);
}
}
我通过短暂延迟调用 requestLayout() 解决了这个问题。无论出于何种原因,即使调用了 onSurfaceTextureAvailable 并报告纹理可用,它也不会立即发生。稍微延迟请求新布局可解决此问题。