簡體   English   中英

為什么Android中的倒數計時器這么慢?

[英]Why is my countdown timer in Android so slow?

我正在嘗試在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環境。

根據倒計時器的Android文檔

對onTick(long)的調用將同步到此對象,以便在上一次回調完成之前不會發生對onTick(long)的一次調用。 這僅在onTick(long)的執行花費一定時間執行時才相關,這與倒計時間隔相比是顯着的。

看一下倒數計時器倒數計時器示例的這個例子

或者,您可以生成一個新線程,只需讓該線程在您想要的時間間隔內休眠,並在喚醒時采取措施,反之亦然。

你也可以進行時間任務

使用將發布相同runnable的處理程序。 這將消除額外線程的需要:

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

在runnable中,再次為同一個處理程序調用postRunnable(並添加何時停止的條件)。

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

                }
            });

        }
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM