Android中實(shí)現(xiàn)多線程的幾種方式小結(jié)
1. 基礎(chǔ)線程(Thread)
原理
通過(guò) Java 的 Thread 類(lèi)直接創(chuàng)建并啟動(dòng)線程,適用于簡(jiǎn)單的異步任務(wù)。
示例
new Thread(new Runnable() {
@Override
public void run() {
// 子線程執(zhí)行耗時(shí)任務(wù)(如網(wǎng)絡(luò)請(qǐng)求)
// 注意:不能直接在此更新 UI!
runOnUiThread(() -> {
textView.setText("任務(wù)完成"); // 切換到主線程更新 UI
});
}
}).start();
// Kotlin 簡(jiǎn)化寫(xiě)法
Thread {
// 子線程任務(wù)
runOnUiThread { textView.text = "任務(wù)完成" }
}.start()缺點(diǎn)
手動(dòng)管理復(fù)雜:線程數(shù)量過(guò)多時(shí)難以控制。
無(wú)法直接更新 UI:必須通過(guò) runOnUiThread 或 Handler 切回主線程。
2. Handler 與 Looper
原理
通過(guò) Handler 和 Looper 實(shí)現(xiàn)線程間通信,適用于需要頻繁在主線程更新 UI 的場(chǎng)景。
示例
// 主線程創(chuàng)建 Handler
Handler mainHandler = new Handler(Looper.getMainLooper());
new Thread(() -> {
// 子線程執(zhí)行任務(wù)
mainHandler.post(() -> {
textView.setText("通過(guò) Handler 更新 UI");
});
}).start();
擴(kuò)展:子線程創(chuàng)建消息循環(huán)
// 子線程初始化 Looper
class WorkerThread extends Thread {
private Handler workerHandler;
@Override
public void run() {
Looper.prepare(); // 創(chuàng)建 Looper
workerHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
// 處理子線程收到的消息
}
};
Looper.loop(); // 啟動(dòng)消息循環(huán)
}
}優(yōu)點(diǎn)
靈活控制線程通信:支持延遲消息、消息隊(duì)列管理。
主線程安全更新 UI。
3. AsyncTask(已廢棄,僅作了解)
原理
Android 早期提供的異步任務(wù)工具,內(nèi)部封裝了線程切換邏輯。
示例
private class MyAsyncTask extends AsyncTask<Void, Integer, String> {
@Override
protected String doInBackground(Void... voids) {
// 子線程執(zhí)行耗時(shí)任務(wù)
publishProgress(50); // 更新進(jìn)度
return "結(jié)果";
}
@Override
protected void onProgressUpdate(Integer... values) {
// 主線程更新進(jìn)度條
progressBar.setProgress(values[0]);
}
@Override
protected void onPostExecute(String result) {
// 主線程處理結(jié)果
textView.setText(result);
}
}
// 啟動(dòng)任務(wù)
new MyAsyncTask().execute();缺點(diǎn)
內(nèi)存泄漏風(fēng)險(xiǎn):若 AsyncTask 持有 Activity 引用,可能導(dǎo)致無(wú)法回收。
API 30+ 已廢棄:推薦使用協(xié)程或 ExecutorService。
4. ExecutorService(線程池)
原理
Java 并發(fā)框架提供的線程池管理,適合需要控制并發(fā)數(shù)量的場(chǎng)景。
示例
// 創(chuàng)建固定大小的線程池
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(() -> {
// 子線程執(zhí)行任務(wù)
runOnUiThread(() -> textView.setText("任務(wù)完成"));
});
// 關(guān)閉線程池(通常在 onDestroy 中調(diào)用)
executor.shutdown();
優(yōu)點(diǎn)
資源復(fù)用:避免頻繁創(chuàng)建/銷(xiāo)毀線程的開(kāi)銷(xiāo)。
任務(wù)隊(duì)列管理:支持提交 Runnable 或 Callable 任務(wù)。
5. IntentService(已廢棄,推薦 WorkManager)
原理
繼承自 Service,內(nèi)部通過(guò) HandlerThread 處理異步任務(wù),適合后臺(tái)執(zhí)行獨(dú)立任務(wù)。
示例
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
// 子線程執(zhí)行任務(wù)(如文件下載)
// 無(wú)需手動(dòng)停止,任務(wù)完成后自動(dòng)銷(xiāo)毀
}
}
// 啟動(dòng)服務(wù)
Intent intent = new Intent(context, MyIntentService.class);
startService(intent);
缺點(diǎn)
Android 8.0+ 限制后臺(tái)服務(wù):需改用 WorkManager 或 JobScheduler。
6. Kotlin 協(xié)程(Coroutines,現(xiàn)代推薦方案)
原理
通過(guò)掛起函數(shù)(Suspend Function)實(shí)現(xiàn)非阻塞異步操作,簡(jiǎn)化回調(diào)地獄。
示例
// ViewModel 中使用協(xié)程
class MyViewModel : ViewModel() {
fun fetchData() {
viewModelScope.launch(Dispatchers.IO) { // 切換到 IO 線程
val result = apiService.getData() // 網(wǎng)絡(luò)請(qǐng)求
withContext(Dispatchers.Main) { // 切回主線程
textView.text = result
}
}
}
}
// 并發(fā)任務(wù)處理
viewModelScope.launch {
val deferred1 = async { fetchData1() } // 啟動(dòng)異步任務(wù)1
val deferred2 = async { fetchData2() } // 啟動(dòng)異步任務(wù)2
val result1 = deferred1.await() // 等待任務(wù)1完成
val result2 = deferred2.await() // 等待任務(wù)2完成
showResult(result1 + result2) // 合并結(jié)果
}優(yōu)點(diǎn)
- 代碼簡(jiǎn)潔:用同步寫(xiě)法實(shí)現(xiàn)異步邏輯。
- 生命周期感知:自動(dòng)綁定到 ViewModel 或 Activity 生命周期。
- 靈活調(diào)度:通過(guò) Dispatchers.Main/IO/Default 指定線程。
7. HandlerThread
原理
結(jié)合 Thread 和 Looper,適用于需要長(zhǎng)時(shí)間運(yùn)行的子線程任務(wù)。
示例
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
handler.post(() -> {
// 在 HandlerThread 中執(zhí)行任務(wù)
});
// 銷(xiāo)毀時(shí)釋放資源
handlerThread.quit();
對(duì)比總結(jié)
| 方式 | 適用場(chǎng)景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| Thread | 簡(jiǎn)單異步任務(wù) | 直接易用 | 手動(dòng)管理復(fù)雜,無(wú)法直接更新 UI |
| Handler | 主線程通信 | 靈活控制消息隊(duì)列 | 代碼冗余 |
| AsyncTask | 舊項(xiàng)目簡(jiǎn)單任務(wù)(已廢棄) | 自動(dòng)線程切換 | 內(nèi)存泄漏風(fēng)險(xiǎn),API 廢棄 |
| Executor | 線程池管理 | 資源復(fù)用,任務(wù)隊(duì)列管理 | 需手動(dòng)切換主線程 |
| IntentService | 后臺(tái) 獨(dú)立任務(wù)(已廢棄) | 自動(dòng)銷(xiāo)毀 | 受系統(tǒng)限制,替代方案更優(yōu) |
| 協(xié)程 | 現(xiàn)代異步編程 | 代碼簡(jiǎn)潔,生命周期感知 | 需學(xué)習(xí) Kotlin 語(yǔ)法 |
| HandlerThread | 需要 Looper 的子線程任務(wù) | 自帶消息循環(huán) | 需手動(dòng)退出 |
最佳實(shí)踐建議
簡(jiǎn)單任務(wù):使用 Thread + Handler 或 runOnUiThread。
復(fù)雜并發(fā):優(yōu)先選擇 協(xié)程(配合 viewModelScope 或 lifecycleScope)。
線程池管理:使用 ExecutorService 控制并發(fā)數(shù)量。
后臺(tái)持久任務(wù):采用 WorkManager(兼容不同 API 版本)。
通過(guò)合理選擇多線程方案,可顯著提升 App 的響應(yīng)速度和用戶體驗(yàn),同時(shí)避免 ANR(Application Not Responding)問(wèn)題。
到此這篇關(guān)于Android中實(shí)現(xiàn)多線程的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Android實(shí)現(xiàn)多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android學(xué)習(xí)之AppWidget筆記分享
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)筆記之AppWidget的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08
Android compose氣泡升起和水滴下墜動(dòng)畫(huà)實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Android compose氣泡升起和水滴下墜動(dòng)畫(huà)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android ListView實(shí)現(xiàn)上拉加載下拉刷新和滑動(dòng)刪除功能
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)上拉加載下拉刷新和滑動(dòng)刪除功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android自定義View實(shí)現(xiàn)水波紋效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)水波紋效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android實(shí)現(xiàn)簡(jiǎn)潔的APP更新dialog數(shù)字進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)潔的APP更新dialog數(shù)字進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android MIUI通知類(lèi)短信權(quán)限的坑
本篇文章主要介紹了Android MIUI通知類(lèi)短信權(quán)限的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果示例代碼
這篇文章主要介紹了Android快速實(shí)現(xiàn)動(dòng)態(tài)模糊效果示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
Android模擬用戶點(diǎn)擊的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android模擬用戶點(diǎn)擊的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)學(xué)習(xí)學(xué)習(xí)吧。2018-02-02

