Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 曲面视图绘制线程-忙循环?_Android - Fatal编程技术网

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

Android 曲面视图绘制线程-忙循环?,android,Android,所有使用SurfaceView的示例似乎都使用执行繁忙循环的run方法。这样做有效吗?我能看到的所有代码都遵循这个来自月球着陆器示例的范例。然而,创建繁忙的while循环似乎是编写多线程应用程序的一种奇怪方式。绘图代码不应该等待绘图命令或类似命令的队列。我本可以用这种方式实现它,但我看到的代码数量如下,这让我提出了一个问题。。。在SurfaceView上绘制线程的最佳语义是什么 public void run() { while (mRun) {

所有使用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);
                    }
                }
            }
        }

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

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