CountDownTimer 根本不工作
CountDownTimer not working at all
我正在尝试 运行 线程内的 CountDownTimer,但它不会工作..
所以在 MainActivity 的 onCreate 中,我在单击按钮时启动它:
public void onClick(final View v) {
Log.d("Main", "onClick");
runOnUiThread(runner);
}
runner
是 class 的一个实例,它实现了 Runnable
:
private CountDownLatch doneSignal = new CountDownLatch(1);
@Override
public void run() {
Log.d("WR", "run");
this.countDown(20);
Log.d("WR", "waiting");
try {
doneSignal.await();
} catch (final InterruptedException ex) {
Log.e("WR", ex.getMessage(), ex);
}
Log.d("WR", "waited");
}
private void countDown(int time) {
final CountDownTimer timer = new CountDownTimer(time * 1000, 1000) {
@Override
public void onTick(final long millisUntilFinished) {
Log.d("WR", "onTick");
}
@Override
public void onFinish() {
Log.d("WR", "onFinish");
doneSignal.countDown();
}
};
Log.d("WR", "starting");
timer.start();
Log.d("WR", "started");
}
使用此代码,应用程序仅在登录 onClick、运行 和启动后冻结。
将 runOnUiThread(runner)
更改为 new Thread(runner).start();
会使应用程序在登录 onClick 后立即崩溃,没有更多输出。
一些研究表明,由于使用了处理程序,CountDownTimer 需要在 UI-Thread 上 运行。但它只是冻结。
当我删除整个 Thread 内容并仅在 Buttons onClick 中调用 runner.run();
(同时删除 运行ner 实例中的 Runnable 实现)时,我得到以下日志条目:onCLick, run, starting, started, waiting
.但是之后什么也没有发生,好像定时器没有运行,没有调用onTick方法
如何修复我的 CountDownTimer?
CountDownTimer
运行s 在 Ui 线程上,它必须 运行 在 UI 线程上,因为它在内部使用处理程序,这又需要一个 Looper。 runOnUiThread(runner);
无论 运行ner 做什么,运行s 在 UI 线程上。
private CountDownLatch doneSignal = new CountDownLatch(1);
在 UI 线程上调用 await()
会阻止它,并且由于 countDown()
运行 在同一个线程上,您实际上 dead-locked
您的应用程序
我正在尝试 运行 线程内的 CountDownTimer,但它不会工作..
所以在 MainActivity 的 onCreate 中,我在单击按钮时启动它:
public void onClick(final View v) {
Log.d("Main", "onClick");
runOnUiThread(runner);
}
runner
是 class 的一个实例,它实现了 Runnable
:
private CountDownLatch doneSignal = new CountDownLatch(1);
@Override
public void run() {
Log.d("WR", "run");
this.countDown(20);
Log.d("WR", "waiting");
try {
doneSignal.await();
} catch (final InterruptedException ex) {
Log.e("WR", ex.getMessage(), ex);
}
Log.d("WR", "waited");
}
private void countDown(int time) {
final CountDownTimer timer = new CountDownTimer(time * 1000, 1000) {
@Override
public void onTick(final long millisUntilFinished) {
Log.d("WR", "onTick");
}
@Override
public void onFinish() {
Log.d("WR", "onFinish");
doneSignal.countDown();
}
};
Log.d("WR", "starting");
timer.start();
Log.d("WR", "started");
}
使用此代码,应用程序仅在登录 onClick、运行 和启动后冻结。
将 runOnUiThread(runner)
更改为 new Thread(runner).start();
会使应用程序在登录 onClick 后立即崩溃,没有更多输出。
一些研究表明,由于使用了处理程序,CountDownTimer 需要在 UI-Thread 上 运行。但它只是冻结。
当我删除整个 Thread 内容并仅在 Buttons onClick 中调用 runner.run();
(同时删除 运行ner 实例中的 Runnable 实现)时,我得到以下日志条目:onCLick, run, starting, started, waiting
.但是之后什么也没有发生,好像定时器没有运行,没有调用onTick方法
如何修复我的 CountDownTimer?
CountDownTimer
运行s 在 Ui 线程上,它必须 运行 在 UI 线程上,因为它在内部使用处理程序,这又需要一个 Looper。 runOnUiThread(runner);
无论 运行ner 做什么,运行s 在 UI 线程上。
private CountDownLatch doneSignal = new CountDownLatch(1);
在 UI 线程上调用 await()
会阻止它,并且由于 countDown()
运行 在同一个线程上,您实际上 dead-locked
您的应用程序