关于用循环包装处理程序的建议

Advices on wrapping a handler with a loop

我最近一直在尝试将计时器添加到我的应用程序中。我使用了一个处理程序和 public 运行 方法来做到这一点。到目前为止,我只设法让计时器达到 运行 一秒钟。我尝试使用 while 循环,但无论我把它放在哪里,只要我启动计时器,应用程序就会崩溃。如果有人能给我一个在这种情况下使用循环的例子,我会很高兴,这样计时器就会 运行 只要我想要它就可以。

这是我的代码:

if (v == btnStart) {
            Toast.makeText(ScoreBoardActivity.this, "The game has started. ENJOY!", Toast.LENGTH_LONG).show();
            btnStart.setText("STOP GAME");
            int playTime = (getIntent().getExtras().getInt("gameTime")) / 10;
            Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                        int playTime = (getIntent().getExtras().getInt("gameTime")) / 10;
                        if (sec1 < 9) {
                            sec1 = sec1 + 1;
                            tvSec1.setText(String.valueOf(sec1));
                            tvSec10.setText(String.valueOf(sec10));
                            tvMin10.setText(String.valueOf(min10));
                            tvMin1.setText(String.valueOf(min1));
                        } else if (sec1 == 9 && sec10 < 5) {
                            sec1 = 0;
                            sec10 = sec10 + 1;
                            tvSec1.setText(String.valueOf(sec1));
                            tvSec10.setText(String.valueOf(sec10));
                            tvMin10.setText(String.valueOf(min10));
                            tvMin1.setText(String.valueOf(min1));
                        } else if (sec1 == 9 && sec10 == 5 && min1 < 9) {
                            sec1 = 0;
                            sec10 = 0;
                            min1 = min1 + 1;
                            tvSec1.setText(String.valueOf(sec1));
                            tvSec10.setText(String.valueOf(sec10));
                            tvMin10.setText(String.valueOf(min10));
                            tvMin1.setText(String.valueOf(min1));
                        } else if (sec1 == 9 && sec10 == 5 && min1 == 9 && min10 < playTime) {
                            sec1 = 0;
                            sec10 = 0;
                            min1 = 0;
                            min10 = min10 + 1;
                            tvSec1.setText(String.valueOf(sec1));
                            tvSec10.setText(String.valueOf(sec10));
                            tvMin10.setText(String.valueOf(min10));
                            tvMin1.setText(String.valueOf(min1));
                        }
                    }
                }, 1000);
            }

您应该在每个 运行() 调用中调用 PostDelayed(handler, 1000) 以在 1 秒后安排另一个 运行:

final Handler handler = new Handler();
Runnable myRunnable = new Runnable() {
    public void run() {
        ...
        handler.PostDelayed(this, 1000);
    }
}
handler.PostDelayed(myRunnable, 1000);

您不能在处理程序中使用 while 循环和休眠,因为那样会阻塞 UI 线程,使您的应用无响应并最终崩溃。