Java 直到次线程停止,SurfaceView才会更新

Java 直到次线程停止,SurfaceView才会更新,java,android,graphics,android-canvas,surfaceview,Java,Android,Graphics,Android Canvas,Surfaceview,这里存在一个类似的问题,但似乎不适用于我的问题: 问题描述见结尾,但首先 我的代码 我有一个非常简单的活动: ... void onCreate(...) { setContentView(new MySurfaceView(this)) } ... MySurfaceView.java: MySurfaceViewThread.java: 问题 曲面视图从不更新,即使idrawColor重复。不会引发异常,并且会调用lockCanvas和unlockCanvasAndPost。但是

这里存在一个类似的问题,但似乎不适用于我的问题:

问题描述见结尾,但首先

我的代码 我有一个非常简单的活动:

...
void onCreate(...) {
    setContentView(new MySurfaceView(this))
}
...
MySurfaceView.java: MySurfaceViewThread.java: 问题 曲面视图从不更新,即使i
drawColor
重复。不会引发异常,并且会调用
lockCanvas
unlockCanvasAndPost
。但是,启动应用程序后,活动仍为黑色

我注意到一些有趣的行为:如果我在循环运行时限制
的次数,那么线程完成后,曲面视图将最终绘制


我知道我可以复制和粘贴一些工作代码,但我问这个问题的目的是更好地理解为什么这不起作用,并了解一些关于Android的信息
SurfaceView

尝试删除
holder=getHolder()来自构造函数。并添加
this.holder=holder
到您的
公共作废surfaceCreated(SurfaceHolder holder)
方法。

我不敢相信:它归结为一行(不是一直都是这样吗?):

与:

task.start(); // starts running the code in a separate thread, as expected.

我需要在ctor中为
holder.addCallback(this)
添加
this.holder=getHolder()
,但我确实将
this.holder=holder
添加到
surfaceCreated(…)
surfaceChanged(…)
。。。它仍然等待更新
SurfaceView
,直到线程完成执行。(我更新了我的答案,以反映我是如何采纳这一建议的)我只是遇到了同样的行为,并没有找到问题。。我正在调用线程对象
start()
方法(正如您指出的,这是问题的根源),但是
unlockCanvasAndPost()
仍然不会刷新屏幕,尽管我的绘图方法中的绘图说明正在运行。。。与您的代码结构相同,活动、SurfaceView对象和SurfaceView对象中的Thread对象在激发
onSurfaceCreated
方法时启动。。。。我绝望了:P编辑:我要试试这个:
public class MySurfaceViewThread extends Thread {
    private SurfaceHolder holder = null;
    private int blue = 235;
    private volatile boolean run = true;

    public MySurfaceViewThread(SurfaceHolder h) {
        holder = h;
    }

    @Override
    public void run() {
        while(run) {
            if (holder.getSurface().isValid()) {
                Canvas c = holder.lockCanvas();
                if ((blue += 10) > 255)
                    blue = 0;
                c.drawColor(Color.argb(255, 0, 0, blue));
                holder.unlockCanvasAndPost(c);

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void postStop() {
        run = false;
    }
}
task.run(); // NO!...runs the code synchronously
task.start(); // starts running the code in a separate thread, as expected.