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

Android UI 線程啟動新線程複製文件仍卡頓:IO 阻塞與線程調度優化

     編輯:程式設計綜合問答

現象

在 UI 線程中 `new Thread(copyTask).start()` 複製大量文件,界面仍出現明顯延遲/卡頓。

原因分析

  1. IO 操作佔用系統資源: 文件讀寫雖在子線程,但會佔用磁帶 I/O 帶寬、頁面緩存、CPU 時間片,導致 UI 線程渲染幀率下降 (掉幀)。
  2. 大量小文件頻繁系統調用: `copyDir` 遞歸遍歷、創建文件流、逐字節/緩衝區拷貝,產生大量 JNI 調用與系統調用開銷。
  3. GC 壓力: 過程中產生大量臨時對象 (byte[]、File、Stream),觸發頻繁 GC,導致 UI 線程暫停。

優化方案

1. 使用 Android 異步工具類 (推薦)

// Kotlin 協程 + IO 調度器
lifecycleScope.launch(Dispatchers.IO) {
    copyDirs() // 耗時操作
    withContext(Dispatchers.Main) {
        // 更新 UI 提示完成
    }
}

2. IntentService / JobIntentService (舊版)

後台服務處理長耗時任務,不阻塞 UI 進程。

3. 文件操作優化

  • 使用大緩衝區 (BufferedInputStream/OutputStream 8KB+) 或 NIO FileChannel.transferTo() (零拷貝)。
  • 批量操作合併事務,減少文件系統同步刷盤次數。
  • 避免在循環中頻繁創建對象,複用緩衝區。

4. 進程隔離 (極端大文件)

在單獨進程 (`android:process=":filecopier"`) 中執行複製,通過 Messenger/AIDL 通訊,完全隔離主進程資源爭搶。

總結

單純 `new Thread` 無法解決 IO 密集型任務對 UI 的影響,**協程/服務 + IO 優化 + 進程隔離** 才是完整方案。

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