为什么Android中的倒数计时器这么慢?

时间:2012-06-01 22:35:25

标签: java android timer

我正在尝试在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环境。

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);

                }
            });

        }
    };