在 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 後再次執行
}
}
});
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));
lifecycleScope.launch {
for (k in 1..100) {
textView.text = "$k%"
delay(15)
}
}
非阻塞定時更新,UI 流暢顯示每一幀進度。