2012-06-01 28 views
0

我想在android中製作一個倒計時器,以便在一個小型的android應用程序中使用。該應用程序將從幾秒鐘倒數到0,然後它會執行一些操作。我正在使用由android.os.countdowntimer提供的coundowntimer。這是我的代碼:爲什麼我的Android倒計時器如此慢?

/** 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

任何人都可以幫助我爲什麼我的計時器是如此之慢,並提供一種方法來加快一點? (EDIT):我在一個模擬器上運行這個intel intel原子x86。我正在模擬一個android 2.3.3環境。

+0

這是一個真實的設備或模擬器上進行? – Squonk

+0

您是否有任何在GUI線程上運行的長時間任務?這可能會延遲對onTick的呼叫。 –

+0

我幾乎沒有任何其他的GUI線程。那個計時器非常多。 – Waffles

回答

1

據爲倒計時

到onTick(長)的調用Android文檔,使前原回調完成後永遠不會發生一個呼叫onTick(長)同步到這個對象。這隻有在onTick(long)的執行需要一定的時間才能執行,與倒計時間隔相比是顯着的時候纔有意義。

看看這個例子倒計時 Countdown timer example

或者你可以創建新的線程,只是拿到線程睡眠所需的時間間隔,當它醒來,反之亦然採取行動。

您也可以TimerTask的

1

使用一個處理程序,將發佈相同的可運行。在可運行

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

,再次調用postRunnable爲同一處理器(並添加了對何時停止的條件):這將刪除需要額外的線程。

+0

我需要僞造一個progerssbar更新,並且此方法比CountDownTimer運行得更順暢。 –

0

無論如何更新性能,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; 
} 
} 

請記住,每次你有時間來更新你的用戶界面,調用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); 

       } 
      }); 

     } 
    };