滚动进出视图时,TextureView isAvailable有时为假

时间:2019-03-25 17:42:23

标签: android textureview

我有一个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);
    }
}

1 个答案:

答案 0 :(得分:0)

我通过短暂延迟调用requestLayout()解决了这个问题。无论出于何种原因,即使调用了onSurfaceTextureAvailable并将其报告为可用纹理,也不会立即将其报告。稍稍延迟即可请求新的布局即可解决此问题。