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

Android Thread.sleep 阻塞主線程導致 UI 更新延遲:正確異步寫法

     編輯:程式設計綜合問答

現象

代碼:textView.setText("刷新成功"); Thread.sleep(500); 期望先顯示文字再休眠,實際**休眠結束後才顯示文字**,但 Logcat 先輸出日志。

原因

  • Thread.sleep() **阻塞當前線程**(此處為主線程/UI 線程)。
  • UI 繪製、事件分發、佈局均在主線程,**阻塞導致界面凍結**,文字更新的消息排隊等待睡眠結束才處理。
  • Logcat 由獨立進程/線程異步收集日志,**不受主線程阻塞影響**,故先輸出。

正確異步寫法

方案一:Handler postDelayed (Java)

textView.setText("刷新成功");
new Handler(Looper.getMainLooper()).postDelayed(() -> {
    // 500ms 後執行的操作(如跳轉、隱藏等)
    doSomethingAfterDelay();
}, 500);

方案二:Kotlin 協程

lifecycleScope.launch {
    textView.text = "刷新成功"
    delay(500) // 掛起協程,不阻塞主線程
    doSomethingAfterDelay()
}

方案三:RxJava

Observable.just("刷新成功")
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext { textView.setText(it) }
    .delay(500, TimeUnit.MILLISECONDS)
    .subscribe { doSomethingAfterDelay() }

關鍵原則

**主線程只做 UI 操作,耗時/等待操作必須異步/非阻塞**。Thread.sleep、大循環、同步 I/O、數據庫操作均不可在主線程執行。

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