Java 睡在画布上的线

Java 睡在画布上的线,java,android,android-canvas,Java,Android,Android Canvas,在我的游戏中,我想在输了或赢了一关后把屏幕画成黑色,然后在屏幕上画一条白色的信息。延迟几秒钟后,我希望触摸时屏幕消失。下面是我的draw()方法的一部分。问题是,屏幕在绘制黑色屏幕和文本之前冻结(或线程休眠),即使sleep命令在绘制文本和画布之后。知道为什么会这样吗 if (state == WIN || state == LOSE){ canvas.drawColor(Color.BLACK); message = "Touch Screen To Start

在我的游戏中,我想在输了或赢了一关后把屏幕画成黑色,然后在屏幕上画一条白色的信息。延迟几秒钟后,我希望触摸时屏幕消失。下面是我的draw()方法的一部分。问题是,屏幕在绘制黑色屏幕和文本之前冻结(或线程休眠),即使sleep命令在绘制文本和画布之后。知道为什么会这样吗

if (state == WIN || state == LOSE){
        canvas.drawColor(Color.BLACK);
        message = "Touch Screen To Start";                                                
        canvas.drawText(message + "", mCanvasWidth / 2, mCanvasHeight / 2, white);
        try {
        GameThread.sleep(500);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }       

可能是对drawText的调用比您意识到的时间长了几分之一秒,而且由于您立即调用了sleep,因此您实际上是在绘制之前休眠线程


尝试在调用sleep之前放置一个小循环,例如(i<10000)或其他东西,看看这是否有帮助。

可能是调用drawText比您意识到的时间长了几分之一秒,而且由于您立即调用sleep,因此您实际上是在绘制之前休眠线程

尝试在呼叫睡眠之前放置一个小循环,例如(i<10000)或其他东西,看看这是否有帮助。

使用倒计时

 http://developer.android.com/reference/android/os/CountDownTimer.html


 new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     // Here you do check every second = every 1000 milliseconds
 }

 public void onFinish() {
    // Here you can restart game after 30 seconds which is 30K milliseconds.
     mTextField.setText("done!");
 }
}.start();
使用倒计时

 http://developer.android.com/reference/android/os/CountDownTimer.html


 new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     // Here you do check every second = every 1000 milliseconds
 }

 public void onFinish() {
    // Here you can restart game after 30 seconds which is 30K milliseconds.
     mTextField.setText("done!");
 }
}.start();

我觉得canvas函数在返回之前不会显示任何内容。特别是如果你在Android>3.0上运行,硬件加速,或者任何双缓冲配置,它在完成之前不会真正更新屏幕

而是在绘制黑屏时,存储当前时间。比如:

mStartTime = System.currentTimeMillis();
if( (System.currentTimeMillis() - mStartTime)/1000 > 5){
    //Put code here to run after 5 seconds
}
然后在“监视压力机”功能中,检查经过了多少秒,并查看是否有足够的时间,例如:

mStartTime = System.currentTimeMillis();
if( (System.currentTimeMillis() - mStartTime)/1000 > 5){
    //Put code here to run after 5 seconds
}

这应该可以绘制文本并避免阻塞Ui线程(在各个方面都是一个大禁忌)。

我感觉canvas函数在返回之前实际上不会显示任何内容。特别是如果你在Android>3.0上运行,硬件加速,或者任何双缓冲配置,它在完成之前不会真正更新屏幕

而是在绘制黑屏时,存储当前时间。比如:

mStartTime = System.currentTimeMillis();
if( (System.currentTimeMillis() - mStartTime)/1000 > 5){
    //Put code here to run after 5 seconds
}
然后在“监视压力机”功能中,检查经过了多少秒,并查看是否有足够的时间,例如:

mStartTime = System.currentTimeMillis();
if( (System.currentTimeMillis() - mStartTime)/1000 > 5){
    //Put code here to run after 5 seconds
}

这应该可以画出你的文本,避免阻塞Ui线程(在各个方面都是一个大禁忌)。

这不会解决你的问题,而是一个小小的挑剔:
thread.sleep(…)
是一个静态方法,所以不要在线程实例上调用它,而是在类上调用它。你确定这就是你所观察到的吗?半秒钟的延迟可能很难辨别。如果你延迟5秒,你的画布画还会在延迟后出现吗?顺便说一句,我认为500可能不是合适的时间。我想它是在毫秒之内。考虑一下倒计时定时器,就像我在下面张贴的那样。这不会解决你的问题,而是一个小问题:<代码>线程。睡眠(…)<代码>是一个静态方法,所以不要在线程实例上调用它,而是在类上调用它。你确定这就是你观察到的吗?半秒钟的延迟可能很难辨别。如果你延迟5秒,你的画布画还会在延迟后出现吗?顺便说一句,我认为500可能不是合适的时间。我认为它在毫秒之内。考虑倒计时定时器,正如我在下面张贴的。这个方法是OnTcCK()被调用第二秒直到30秒上升。此时将调用onFinish()。我认为这应该行得通。您可以在onFinish中重新启动任何程序,并保持每秒检查一次。它是完全可配置的。它的工作方式是在30秒结束前每隔一秒调用onTick()。此时将调用onFinish()。我认为这应该行得通。您可以在onFinish中重新启动任何程序,并保持每秒检查一次。这是完全可配置的。谢谢!这把它修好了。知道我们为什么不应该阻止UI线程吗?它真的不会伤害我的程序,我不认为……Ui线程通常是系统与应用程序通信的地方。这种设计在我处理过的每个工具包中都有重复。如果你阻止它,Android不知道你是故意阻止的,还是正在崩溃,用户需要杀了你(参见停止问题()。因此,每当你阻止它时,Android就会心烦意乱,因为它不知道你在做什么。它也假设你不知道,这对性能有好处。谢谢!这解决了它。你知道为什么不应该阻止UI线程吗?这真的不会伤害我的程序我不认为…UI线程通常是系统通信的地方在我处理过的每个工具包中都会重复这种设计。如果你阻止了它,Android不知道你是故意阻止的,还是正在崩溃,用户需要杀死你(参见停止问题()因此,每当你阻止它时,安卓就会心烦意乱,因为它不知道你在做什么。它也会在你不知道的情况下构建,这对性能等方面都有好处。