首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 倒計時實現方案:CountDownTimer 與 Handler 兩種做法比較

     編輯:Java 相關知識

需求背景

常見場景:獲取驗證碼按鈕點擊後 60 秒倒計時,期間按鈕不可用、顯示剩餘秒數,結束後恢復。本文對比兩種主流實現方式。

方案一:CountDownTimer(推薦)

Android 專用工具類,封裝了 Handler 機制,API 簡潔,自動處理生命週期。

核心用法

private class TimeCount extends CountDownTimer {
    public TimeCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }
    @Override
    public void onTick(long millisUntilFinished) {
        btn.setClickable(false);
        btn.setText("(" + millisUntilFinished / 1000 + ")秒後重試");
    }
    @Override
    public void onFinish() {
        btn.setClickable(true);
        btn.setText("獲取驗證碼");
    }
}

// 使用
TimeCount timer = new TimeCount(60_000, 1000);
timer.start();

優點

  • 代碼極簡,語義清晰。
  • 內部自動處理訊息佇列,無需手動管理 Handler。
  • 提供 cancel() 方法,配合 onDestroy() 釋放資源,防內存洩漏。

方案二:Handler + Thread(手動控制)

適用於需要高度自定義邏輯、或非 UI 執行緒場景。

核心代碼

private boolean timeFlag = true;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
    @Override public void handleMessage(Message msg) {
        if (msg.what > 0) {
            btn.setText("(" + msg.what + ")秒後重試");
        } else {
            btn.setClickable(true);
            btn.setText("獲取驗證碼");
        }
    }
};

// 啟動執行緒
new Thread(() -> {
    for (int i = 59; i >= 0 && timeFlag; i--) {
        try { Thread.sleep(1000); }
        catch (InterruptedException e) { e.printStackTrace(); }
        mHandler.obtainMessage(i).sendToTarget();
    }
}).start();

// 銷毀時釋放
@Override protected void onDestroy() {
    super.onDestroy();
    timeFlag = false;      // 停止執行緒迴圈
    mHandler.removeCallbacksAndMessages(null); // 清空訊息佇列
}

注意點

  • 必須在 onDestroy 中設置標誌位 false 並清空 Handler,否則執行緒與訊息佇列殘留導致內存洩漏。
  • UI 更新必須在主執行緒,Handler 搭配 Looper.getMainLooper() 確保。

關鍵差異對比

最佳實踐總結

  1. 優先使用 CountDownTimer,簡單場景一行解決。
  2. 複雜場景用 Handler + Thread,務必在 onDestroy/onStop 徹底清理。
  3. 避免在 Thread.sleep 中直接操作 UI,必須透過 Handler/RxJava/LiveData 切回主執行緒。
  4. Kotlin 協程(delay + withContext(Dispatchers.Main))是現代 Android 開發的更優選擇。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度CountDownTimerHandler + Thread
代碼量極少較多
生命週期管理內建 cancel()手動管理標誌位 + Handler 清理
靈活度固定間隔回調完全可控(動態間隔、暫停/繼續)
適用場景標準倒計時、驗證碼複雜定時邏輯、遊戲迴圈、後台任務