表面视图绘制线程 - 忙循环?

时间:2012-05-09 14:22:13

标签: android

使用SurfaceView的所有示例似乎都使用执行繁忙循环的run方法。这是一种有效的方法吗?我能看到的所有代码都遵循月球着陆器样本的这种范例。但是,创建繁忙的while循环似乎是编写多线程应用程序的一种奇怪方式。绘图代码不等于绘图命令队列或类似的东西。我会以这种方式实现它,但是我看到的代码量如下所示让我问这个问题......在SurfaceView上绘制线程的最佳语义是什么。

public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        // DO DRAWING HERE
                    }
                } finally {

                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

我不知道在这种情况下最佳做法是什么,但我在我的应用程序中成功使用了该示例的略微修改版本。由于我响应了触摸输入(而不是不断更新画布),我添加了一个标志来测试绘图是否需要完成。我还在每次刷新后添加了一个睡眠以限制系统负载。这是我在try块中的代码:

            if(mPanel.needsRefresh()) {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    mPanel.onDraw(c);
                }
            } else {
                SystemClock.sleep(10);
            }