首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android TextView 循環更新進度:用 Handler postDelayed 避免阻塞 UI 線程

     編輯:程式設計綜合問答

在 runOnUiThread 中用 Thread.sleep 循環更新 TextView 會阻塞 UI 線程,導致界面凍結只顯示最終結果。正確做法:Handler.postDelayed 遞歸發送消息,每次更新後延遲發送下一次。

錯誤代碼

runOnUiThread(() -> {
    for (int k=1; k<=100; k++) {
        textView.setText(k + "%");
        Thread.sleep(15); // ❌ 阻塞 UI 線程
    }
});

正確代碼

final Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    int k = 0;
    @Override
    public void run() {
        textView.setText(k + "%");
        k++;
        if (k <= 100) {
            handler.postDelayed(this, 15); // 15ms 後再次執行
        }
    }
});

Lambda 簡寫 (Java 8+)

Handler handler = new Handler(Looper.getMainLooper());
IntConsumer update = new IntConsumer() { // 需自定義函數式接口或用 AtomicInteger
    int k = 0;
    @Override public void accept(int value) {
        textView.setText(k + "%");
        if (++k <= 100) handler.postDelayed(this::accept, 15, 0);
    }
};
handler.post(() -> update.accept(0));

Kotlin 協程更簡潔

lifecycleScope.launch {
    for (k in 1..100) {
        textView.text = "$k%"
        delay(15)
    }
}

非阻塞定時更新,UI 流暢顯示每一幀進度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved