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:
问题
曲面视图从不更新,即使idrawColor
重复。不会引发异常,并且会调用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.