0

我正在尝试制作一个基本应用程序,对于该应用程序的一部分,我需要在按下按钮后延迟以允许文本视图显示一个单词,然后更改为另一个单词,然后显示一秒钟并显示另一个单词。S0 3 个字,2 个延迟。我使用 postDelayed() 实现了第一次延迟,效果很好。

@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;
    }
}

该应用程序显示“READY”一秒钟,然后打开一个新线程,然后启动 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");
        }
    }
};

在这里它应该显示“GO!”,暂停线程一秒钟,然后显示“IT WORKED”。但是,当我在手机和模拟器上运行它时,它会显示“READY”2 秒,然后跳到“IT WORKED”或者显示“GO!” 在这么短的时间内,看不到一起跳过它。我已经尝试将 setText("GO!") 移动到 catch 内,但这也不起作用。任何帮助将非常感激。

谢谢你!

4

1 回答 1

0

您可以创建第二个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 线程。仅仅因为代码在 Runnable 中并不一定意味着它在另一个线程上运行。来自Handler.postDelayed的 Android 文档(我假设“timer”是一个 Handler):“导致 Runnable r 被添加到消息队列中,在指定的时间过去后运行。runnable 将运行在附加此处理程序的线程上。”

于 2013-08-05T15:17:05.793 回答