有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您可以创建第二个Runnable并使用postDelayed进行调度,就像第一个一样。在将第一个事件安排在1秒后的同一位置,可以将第二个事件安排在2秒后发生,即第一个事件之后1秒。或者,您可以在第一个可运行时间内将其安排为1秒后。请参见下面代码中的“选项”注释

    @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);
            timer.postDelayed(showItWorked, 2000); // <  OPTION 1
            break;
        }
    }
    
    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);
            }
    
            timer.postDelayed(showItWorked, 1000); // <  OPTION 2
        }
    };
    
    showItWorked = new Runnable()
    {
        @Override
        public void run() {
            display.setText("IT WORKED");
        }
    };
    

    为了澄清现有代码中的错误

    正如Mael在评论中提到的,您对Thread.sleep的使用正在阻塞UI线程。仅仅因为代码在可运行线程中,并不一定意味着它正在另一个线程上运行。从Android文档中的Handler.postDelayed(我假设“timer”是一个处理程序):“使可运行的r添加到消息队列中,在指定的时间后运行。可运行的r将在该处理程序所连接的线程上运行。”