0

我正在尝试在 android 中制作一个倒数计时器,以便在小型 android 应用程序中使用。该应用程序将从一定的秒数倒计时到 0,然后它将执行一些操作。我正在使用 android.os.countdowntimer 提供的倒计时计时器。这是我的代码:

/** 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)复制的

任何人都可以根据为什么我的计时器这么慢来帮助我,并提供一种加快速度的方法吗?

(编辑):我在模拟器上运行它,英特尔原子 x86。我正在模拟一个 android 2.3.3 环境。

4

3 回答 3

1

根据倒数计时器的Android文档

对 onTick(long) 的调用与此对象同步,因此在前一个回调完成之前不会发生对 onTick(long) 的调用。这仅在 onTick(long) 的实现花费与倒计时间隔相比显着的时间来执行时才相关。

看看这个 倒数计时器的例子 倒数计时器的例子

或者,您可以生成一个新线程,让该线程在您想要的时间间隔内休眠,并在它唤醒时采取行动,反之亦然。

你也可以定时任务

于 2012-06-01T22:46:28.270 回答
1

使用将发布相同 runnable 的处理程序。这将消除对额外线程的需要:

Handler handler=new Handler();
handler.postRunnable(... , 1000) ;

在 runnable 中,为同一个处理程序再次调用 postRunnable(并添加何时停止的条件)。

于 2012-06-01T23:00:39.227 回答
1

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

                }
            });

        }
    };
于 2016-11-18T23:31:03.220 回答