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

Android 子線程獲取數據、主線程更新列表的正確姿勢

     編輯:程式設計疑難解答

痛點場景

網絡請求、數據庫查詢等耗時操作必須在子線程執行,但 UI 更新(如 ListView、RecyclerView 刷新)只能在主線程。直接在子線程操作 UI 會拋出 CalledFromWrongThreadException;全放主線程又會導致 ANR 卡頓。

標準解決模式

  1. 子線程獲取數據:使用 Thread、AsyncTask(已棄用)、RxJava、Kotlin 協程 或 OkHttp 回調執行網絡/IO 操作。
  2. 主線程更新 UI:數據獲取完成後,通過 Handler、runOnUiThread、View.post(Runnable) 或 LiveData 觀察者模式將數據傳遞給主線程。
  3. 刷新適配器:調用 adapter.notifyDataSetChanged() 或更精細的 notifyItemInserted/RangeChanged 觸發列表重繪。

代碼示例

// 使用 Handler + 子線程
new Thread(() -> {
    List list = fetchDataFromNet(); // 耗時操作
    new Handler(Looper.getMainLooper()).post(() -> {
        adapter.setData(list);
        adapter.notifyDataSetChanged(); // 關鍵:通知數據變更
    });
}).start();

進階方案推薦

  • ViewModel + LiveData + Repository:Google 官方架構組件,生命周期感知,自動處理線程切換與配置變更。
  • Paging 3:大數據分頁加載,內置線程管理。
  • Kotlin Flow / RxJava:響應式流,鏈式調用 subscribeOn/io、observeOn/main 雅解決線程問題。

參考博客

核心口訣:耗時操作子線程跑,UI 更新主線程調,notifyDataSetChanged 別忘掉。

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