我正在尝试在Android中制作一个倒数计时器,用于小型Android应用程序。该应用程序将从几秒钟倒计时到0,然后它将执行一些操作。我正在使用android.os.countdowntimer提供的coundowntimer。这是我的代码:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.quizlayout);
new CountDownTimer(30000, 1000) {
TextView tx = (TextView) findViewById(R.id.textView2);
public void onTick(long millisUntilFinished) {
tx.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
tx.setText("done!");
}
}.start();
}
然而,这个倒数计时器真的很慢。计时器倒计时需要3个实时秒才能倒计时一秒钟。我想知道发生了什么事?我上面的代码或多或少直接从谷歌(CountDownTimer)
复制任何人都可以帮我解释为什么我的计时器太慢了,并提供一种方法来加快它的速度?
(编辑):我在模拟器上运行它,即intel atom x86。我正在模仿android 2.3.3环境。
答案 0 :(得分:1)
根据倒数计时器的Android文档
对onTick(long)的调用将同步到此对象,以便在上一次回调完成之前不会发生对onTick(long)的一次调用。仅当onTick(long)的执行需要花费一定时间执行时,这与倒计时间隔相比才有意义。
看一下倒数计时器的这个例子 Countdown timer example
或者,您可以生成一个新线程,只需让该线程在您想要的时间间隔内休眠,并在唤醒时采取措施,反之亦然。
您也可以设置时间
答案 1 :(得分:1)
使用将发布相同runnable的处理程序。这将消除对额外线程的需求:
Handler handler=new Handler();
handler.postRunnable(... , 1000) ;
在runnable中,再次为同一个处理程序调用postRunnable(并添加一个停止时间的条件)。
答案 2 :(得分:0)
无论ui更新性能如何,CountDownTimer效率都不高。对于完美的ui更新,最好创建自定义倒计时。我做了我自己,所以在这里。它在我的应用程序上完美无缺。
public abstract class CountDown {
int totalTime = 0;
int tickTime = 0;
Thread thread;
boolean canceled = false;
public CountDown(int totalTime,int tickTime){
this.totalTime = totalTime;
this.tickTime = tickTime;
}
public abstract void onTick();
public abstract void onFinish();
public void start(){
thread = new Thread(new Runnable() {
@Override
public void run() {
// Do in thread
canceled = false;
for (int elapsedTime = 0; elapsedTime < totalTime; elapsedTime += tickTime) {
if(!canceled){
onTick();
try {
thread.sleep(tickTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
if(!canceled){
onFinish();
}
}
});
thread.start();
}
public void cancel(){
canceled = true;
}
}
请记住,每次你必须更新你的ui,调用runOnUiThread,否则你将有一个异常,你不在一个处理程序而不是ui线程。 以下是如何在代码中使用它,它与CountDownTimer完全相同,因此您只需重命名代码中的行:
CountDown cDown = new CountDown(10000, 20) {
public void onTick() {
// Do something
}
public void onFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
myButton.setImageDrawable(drawable);
}
});
}
};