我有一个TextureView,它利用背景线程定期绘制内容。
大多数情况下,这一切都很好,但是我发现,当从可见屏幕上滚动并重新打开此TextureView时,有时会导致isAvailable为false,而lockCanvas返回null。我不知道这是否是要快速将其滚动到视图/视线之外的问题,还是其他问题。
我附加了TextureViewListener,并且 onSurfaceTextureAvailable确实被调用,并且isAvailable从那里返回true。但是,当后台线程尝试在此之后几毫秒内渲染时,isAvailable为false,而lockCanvas返回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);
}
}
答案 0 :(得分:0)
我通过短暂延迟调用requestLayout()解决了这个问题。无论出于何种原因,即使调用了onSurfaceTextureAvailable并将其报告为可用纹理,也不会立即将其报告。稍稍延迟即可请求新的布局即可解决此问题。