关于用循环包装处理程序的建议
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 线程,使您的应用无响应并最终崩溃。
我最近一直在尝试将计时器添加到我的应用程序中。我使用了一个处理程序和 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 线程,使您的应用无响应并最终崩溃。