Android中實現(xiàn)多線程的幾種方式小結(jié)
1. 基礎(chǔ)線程(Thread)
原理
通過 Java 的 Thread 類直接創(chuàng)建并啟動線程,適用于簡單的異步任務(wù)。
示例
new Thread(new Runnable() {
@Override
public void run() {
// 子線程執(zhí)行耗時任務(wù)(如網(wǎng)絡(luò)請求)
// 注意:不能直接在此更新 UI!
runOnUiThread(() -> {
textView.setText("任務(wù)完成"); // 切換到主線程更新 UI
});
}
}).start();
// Kotlin 簡化寫法
Thread {
// 子線程任務(wù)
runOnUiThread { textView.text = "任務(wù)完成" }
}.start()缺點
手動管理復(fù)雜:線程數(shù)量過多時難以控制。
無法直接更新 UI:必須通過 runOnUiThread 或 Handler 切回主線程。
2. Handler 與 Looper
原理
通過 Handler 和 Looper 實現(xiàn)線程間通信,適用于需要頻繁在主線程更新 UI 的場景。
示例
// 主線程創(chuàng)建 Handler
Handler mainHandler = new Handler(Looper.getMainLooper());
new Thread(() -> {
// 子線程執(zhí)行任務(wù)
mainHandler.post(() -> {
textView.setText("通過 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(); // 啟動消息循環(huán)
}
}優(yōu)點
靈活控制線程通信:支持延遲消息、消息隊列管理。
主線程安全更新 UI。
3. AsyncTask(已廢棄,僅作了解)
原理
Android 早期提供的異步任務(wù)工具,內(nèi)部封裝了線程切換邏輯。
示例
private class MyAsyncTask extends AsyncTask<Void, Integer, String> {
@Override
protected String doInBackground(Void... voids) {
// 子線程執(zhí)行耗時任務(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);
}
}
// 啟動任務(wù)
new MyAsyncTask().execute();缺點
內(nèi)存泄漏風(fēng)險:若 AsyncTask 持有 Activity 引用,可能導(dǎo)致無法回收。
API 30+ 已廢棄:推薦使用協(xié)程或 ExecutorService。
4. ExecutorService(線程池)
原理
Java 并發(fā)框架提供的線程池管理,適合需要控制并發(fā)數(shù)量的場景。
示例
// 創(chuàng)建固定大小的線程池
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(() -> {
// 子線程執(zhí)行任務(wù)
runOnUiThread(() -> textView.setText("任務(wù)完成"));
});
// 關(guān)閉線程池(通常在 onDestroy 中調(diào)用)
executor.shutdown();
優(yōu)點
資源復(fù)用:避免頻繁創(chuàng)建/銷毀線程的開銷。
任務(wù)隊列管理:支持提交 Runnable 或 Callable 任務(wù)。
5. IntentService(已廢棄,推薦 WorkManager)
原理
繼承自 Service,內(nèi)部通過 HandlerThread 處理異步任務(wù),適合后臺執(zhí)行獨立任務(wù)。
示例
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
// 子線程執(zhí)行任務(wù)(如文件下載)
// 無需手動停止,任務(wù)完成后自動銷毀
}
}
// 啟動服務(wù)
Intent intent = new Intent(context, MyIntentService.class);
startService(intent);
缺點
Android 8.0+ 限制后臺服務(wù):需改用 WorkManager 或 JobScheduler。
6. Kotlin 協(xié)程(Coroutines,現(xiàn)代推薦方案)
原理
通過掛起函數(shù)(Suspend Function)實現(xiàn)非阻塞異步操作,簡化回調(diào)地獄。
示例
// ViewModel 中使用協(xié)程
class MyViewModel : ViewModel() {
fun fetchData() {
viewModelScope.launch(Dispatchers.IO) { // 切換到 IO 線程
val result = apiService.getData() // 網(wǎng)絡(luò)請求
withContext(Dispatchers.Main) { // 切回主線程
textView.text = result
}
}
}
}
// 并發(fā)任務(wù)處理
viewModelScope.launch {
val deferred1 = async { fetchData1() } // 啟動異步任務(wù)1
val deferred2 = async { fetchData2() } // 啟動異步任務(wù)2
val result1 = deferred1.await() // 等待任務(wù)1完成
val result2 = deferred2.await() // 等待任務(wù)2完成
showResult(result1 + result2) // 合并結(jié)果
}優(yōu)點
- 代碼簡潔:用同步寫法實現(xiàn)異步邏輯。
- 生命周期感知:自動綁定到 ViewModel 或 Activity 生命周期。
- 靈活調(diào)度:通過 Dispatchers.Main/IO/Default 指定線程。
7. HandlerThread
原理
結(jié)合 Thread 和 Looper,適用于需要長時間運(yùn)行的子線程任務(wù)。
示例
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
handler.post(() -> {
// 在 HandlerThread 中執(zhí)行任務(wù)
});
// 銷毀時釋放資源
handlerThread.quit();
對比總結(jié)
| 方式 | 適用場景 | 優(yōu)點 | 缺點 |
|---|---|---|---|
| Thread | 簡單異步任務(wù) | 直接易用 | 手動管理復(fù)雜,無法直接更新 UI |
| Handler | 主線程通信 | 靈活控制消息隊列 | 代碼冗余 |
| AsyncTask | 舊項目簡單任務(wù)(已廢棄) | 自動線程切換 | 內(nèi)存泄漏風(fēng)險,API 廢棄 |
| Executor | 線程池管理 | 資源復(fù)用,任務(wù)隊列管理 | 需手動切換主線程 |
| IntentService | 后臺 獨立任務(wù)(已廢棄) | 自動銷毀 | 受系統(tǒng)限制,替代方案更優(yōu) |
| 協(xié)程 | 現(xiàn)代異步編程 | 代碼簡潔,生命周期感知 | 需學(xué)習(xí) Kotlin 語法 |
| HandlerThread | 需要 Looper 的子線程任務(wù) | 自帶消息循環(huán) | 需手動退出 |
最佳實踐建議
簡單任務(wù):使用 Thread + Handler 或 runOnUiThread。
復(fù)雜并發(fā):優(yōu)先選擇 協(xié)程(配合 viewModelScope 或 lifecycleScope)。
線程池管理:使用 ExecutorService 控制并發(fā)數(shù)量。
后臺持久任務(wù):采用 WorkManager(兼容不同 API 版本)。
通過合理選擇多線程方案,可顯著提升 App 的響應(yīng)速度和用戶體驗,同時避免 ANR(Application Not Responding)問題。
到此這篇關(guān)于Android中實現(xiàn)多線程的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Android實現(xiàn)多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實現(xiàn)簡單斷點續(xù)傳和下載到本地功能
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡單斷點續(xù)傳和下載到本地功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
基于Android10渲染Surface的創(chuàng)建過程
這篇文章主要介紹了基于Android10渲染Surface的創(chuàng)建過程,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
Android監(jiān)聽手機(jī)電話狀態(tài)與發(fā)送郵件通知來電號碼的方法(基于PhoneStateListene實現(xiàn))
這篇文章主要介紹了Android監(jiān)聽手機(jī)電話狀態(tài)與發(fā)送郵件通知來電號碼的方法,通過Android的PhoneStateListene實現(xiàn)該功能,需要的朋友可以參考下2016-01-01
Fragment通過FragmentManager實現(xiàn)通信功能詳細(xì)講解
這篇文章主要介紹了Fragment通過FragmentManager實現(xiàn)通信功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
AndroidStudio升級到3.0的新特性和注意事項小結(jié)
這篇文章主要介紹了AndroidStudio升級到3.0的新特性和注意事項,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
Android中默認(rèn)系統(tǒng)的聲音/大小修改和配置詳解
這篇文章主要給大家介紹了關(guān)于Android中默認(rèn)系統(tǒng)的聲音/大小修改和配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-11-11
Android開發(fā)必備知識 為什么說Kotlin值得一試
為什么說值得一試,這篇文章主要為大家詳細(xì)介紹了Android開發(fā)必備知識,Kotlin的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

