【问题标题】:When should I start drawing on SurfaceView?我应该什么时候开始在 SurfaceView 上绘图?
【发布时间】:2012-10-12 08:38:25
【问题描述】:

我使用SurfaceView来创建选框功能,但有时在SurfaceView中的绘图线程开始运行后,UI线程被阻塞,我对BACK或MENU按钮的触摸没有被调度,并且ANR 产生。这种情况时有发生。

我猜这是因为 SurfaceView 中的绘图开始太早(当然我确保绘图发生在surfaceCreated()surfaceDestroyed() 之间),我绘图线程应该在完全初始化后开始,也许与活动有关?

当我在实际使用SurfaceHolder.lockCanvas() 返回的Canvas 的代码前添加Thread.sleep(100) 开始绘制时,问题几乎消失了,仍然出现,但频率低。如果我在画布上实际绘制东西之前让绘图线程休眠足够长的时间,那么问题就不会再发生了。

看起来我应该在 something 完全初始化后开始绘制,但我不知道那是什么东西。

这个SurfaceView作为一个普通的View放在布局文件中,下面是在surface上绘制的代码。

public void run() {
    try {
        // this is extremely crucial, without this line, surfaceView.lockCanvas() may
        // produce ANR from now and then. Looks like the reason is that we can not start
        // drawing on the surface too early
        Thread.sleep(100);
    } catch (Exception e) {}

    while (running) {
        Canvas canvas = null;
        try{

            long ts = System.currentTimeMillis();

            canvas = surfaceHolder.lockCanvas();
            if (canvas != null) {
                synchronized (surfaceHolder) {
                    doDraw(canvas);
                }

                ts = System.currentTimeMillis() - ts;
                if (ts < delayInterval) {
                    Thread.sleep(delayInterval - ts);
                }
            }

        } catch (InterruptedException e) {
            // do nothing
        } finally {
            if (canvas != null)
                surfaceHolder.unlockCanvasAndPost(canvas);
        }

    }
}

【问题讨论】:

  • 您的代码中的surfaceHolder 对象还有其他同步吗?无论如何你应该在unlockCanvasAndPost之后调用Thread.sleep,而不是在lockCanvasunlockCanvasAndPost之间。
  • 哦,不!你是救世主!当我将Thread.sleep 放在unlockCanvasAndPost 之后时,问题再也不会发生,现在我不需要在循环开始时睡觉。请张贴作为答案,我会接受!

标签: android surfaceview


【解决方案1】:

你不应该在SurfaceHolder.lockCanvasSurfaceHolder.unlockCanvasAndPost之间调用Thread.sleep,它应该在画布解锁后调用。

在您的代码示例中,画布几乎一直处于锁定状态,导致starvation。 SurfaceFlinger 只有一个小窗口来处理画布。所以有时这段代码可能会失败,这就是 ANR 错误是零星的原因。

【讨论】:

  • 太棒了!第二段清楚地描述了问题!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多