java Try/Catch在安卓开发中延迟但阻止了之前的代码
我正在尝试制作一个基本的应用程序,对于该应用程序的一部分,我需要在按下按钮后进行延迟,以允许文本视图显示一个单词一秒钟,然后更改为另一个单词,然后显示该单词一秒钟,再显示另一个单词。S0 3个字,2个延迟。我使用postdayed()实现了第一个延迟,它工作得很好
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch(view.getId())
{
case R.id.bStart:
display.setTextColor(Color.YELLOW);
display.setText("READY");
start.setText("Restart");
timer.postDelayed(makePattern, 1000);
break;
}
}
应用程序显示“就绪”一秒钟,然后打开一个新线程,然后启动makePattern runnable,这就是问题所在
makePattern = new Runnable()
{
@Override
public void run() {
display.setTextColor(Color.GREEN);
display.setText("GO!");
for(int x = 0; x < level; x++) {
pattern[x] = crazy.nextInt(4);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
display.setText("IT WORKED");
}
}
};
这里应该显示“开始!”,暂停线程一秒钟,然后显示“它工作了”。但是,当我在手机和模拟器上运行它时,它会显示“就绪”2秒钟,然后跳到“它工作了”,或者显示“开始!”在如此短的一段时间内,我们不可能把它全部跳过。我已经尝试过移动setText(“GO!”)在捕获物的内部,这也不起作用。任何帮助都将不胜感激
谢谢大家!
# 1 楼答案
您可以创建第二个
Runnable
并使用postDelayed
进行调度,就像第一个一样。在将第一个事件安排在1秒后的同一位置,可以将第二个事件安排在2秒后发生,即第一个事件之后1秒。或者,您可以在第一个可运行时间内将其安排为1秒后。请参见下面代码中的“选项”注释为了澄清现有代码中的错误
正如Mael在评论中提到的,您对
Thread.sleep
的使用正在阻塞UI线程。仅仅因为代码在可运行线程中,并不一定意味着它正在另一个线程上运行。从Android文档中的Handler.postDelayed(我假设“timer”是一个处理程序):“使可运行的r添加到消息队列中,在指定的时间后运行。可运行的r将在该处理程序所连接的线程上运行。”