網絡請求、數據庫查詢等耗時操作必須在子線程執行,但 UI 更新(如 ListView、RecyclerView 刷新)只能在主線程。直接在子線程操作 UI 會拋出 CalledFromWrongThreadException;全放主線程又會導致 ANR 卡頓。
Thread、AsyncTask(已棄用)、RxJava、Kotlin 協程 或 OkHttp 回調執行網絡/IO 操作。Handler、runOnUiThread、View.post(Runnable) 或 LiveData 觀察者模式將數據傳遞給主線程。adapter.notifyDataSetChanged() 或更精細的 notifyItemInserted/RangeChanged 觸發列表重繪。// 使用 Handler + 子線程
new Thread(() -> {
List list = fetchDataFromNet(); // 耗時操作
new Handler(Looper.getMainLooper()).post(() -> {
adapter.setData(list);
adapter.notifyDataSetChanged(); // 關鍵:通知數據變更
});
}).start();
subscribeOn/io、observeOn/main 雅解決線程問題。核心口訣:耗時操作子線程跑,UI 更新主線程調,notifyDataSetChanged 別忘掉。