android Handler vs Timer

來源:互聯網
上載者:User

標籤:

Handler vs Timer

在我們Android開發過程中,經常需要執行一些短周期的定時任務,這時候有兩個選擇Timer或者Handler。然而個人認為: Handler 在多個方面比Timer更為優秀,更推薦使用。

一.易用性

可重複執行 Handler可以重複執行某個任務。 Timer若在某個任務執行/取消之後,再次執行則會拋出一個IllegalStateException異常。為了避免這個異常,需要重新建立一個Timer對象。

周期可調整

若想要執行一個越來越快的定時任務,Handler可以做到,而Timer則消耗較大。 Handler

  • private Handler handler = new Handler();int mDelayTime = 1000;private Runnable runnable = new Runnable() {  public void run() {    update();    if (mDelayTime > 0) {      handler.postDelayed(this,mDelayTime);       mDelayTime -= 100;    }  }};handler.postDelayed(runnable,1000);

     

 

如以上例子,就可以實現對周期的動態調整。 Timer的scheduleAtFixedRate(TimerTask task, long delay, long period)只能執行固定周期的任務,所以不可以動態地調整周期。若想

要動態調整,則需要在執行玩一個定時器任務後,再啟動一個新的任務時設定新的時間。

UI介面更新 Handler:在建立的時候可以指定所在的線程,一般在Activity中構建的,即主線程上,所以可以在回調方法中很方便的更新

介面。 Timer:非同步回調,所以必須藉助Handler去更新介面,不方便。  既然都得用Handler去更新介面了,為何不如把定時的功能也交

Handler去做呢?

二.記憶體佔比

Timer比Handler更占記憶體。接下來的Demo例子通過兩種方法迴圈地列印日誌,然後通過MAT外掛程式來查看這兩個類所需要調用的對象所產生的

佔比。

int mCount = 0;private void startTimer() {Timer timer = new Timer();timer.schedule(new TimerTask() {  @Override  public void run() {    Log.i("JKL", "" + mCount);    mCount++;    }  }, 0, 200);}private void startHandler() {final Handler mHandler = new Handler();mHandler.post(new Runnable() {  @Override  public void run() {    Log.i("JKL", "" + mCount);    mCount++;    mHandler.postDelayed(this, 200);    }  });}

 可以通過建立一個新的Android工程,在onCreate方法中調用以上startTimer或startHandler任意一個方法來測試。以下是MAT的測試結果。

Timer相關對象的記憶體佔比

 

共有5個對象,佔用1192B。Handler相關對象的記憶體佔比

    我們可以看到上面有2個Handler,這時候你是否會疑惑呢?其實一個是我們產生的Handler,另外一個是Activity預設產生的,存在於ViewRootImp中,這涉及到ViewTree的知識,此處不便展開。

不過我們可以知道,我們自己構建的Handler,最多也就只佔64B。

 

在使用Handler的時候,還需要用到Runnable,不過也只佔了16B。所以,使用Handler的方式來作為定時器,最多也就是80B。

以上可以得出結論,相比起Timer方式的定時器佔用1192B,Handler的方式佔用資源會小很多,只有1/60。

所以Handler的方式比較節省記憶體。

寫到這裡,想到一個點,Timer是建立一個線程去計數的,而Handler是在預設主線程啟動並執行。假若Handler也用一個非同步線程去運行,會不會耗很多資源呢?以下是測試代碼:

private void startHandler() {  HandlerThread thread = new HandlerThread("Test");  thread.start();  final Handler mHandler = new Handler(thread.getLooper());  mHandler.post(new Runnable() {    @Override    public void run() {      Log.i("JKL", "" + mCount);      mCount++;      mHandler.postDelayed(this, 200);      }  });}

  

以上用一個HandlerThread來啟動一個新的線程。再看看記憶體佔比

 

以看到HandlerThread也只是佔了96B的記憶體。

綜上所述,Handler記憶體佔比低!而且低了不少。

無論從易用性還是記憶體佔比出發,Handler更勝一籌

android Handler vs Timer

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.