AsyncTask 已經在 Android API 30 正式廢棄。這不是隨意的決定,是因為它太容易造成內存洩漏,且生命週期管理混亂。
現在主流的替代方案是 Kotlin Coroutines 和 RxJava。
核心比較與評估
| 特性 | Kotlin Coroutines | RxJava (RxAndroid) |
| 官方態度 | Google 官方首選,Jetpack 庫深度整合 | 成熟的第三方庫,處於維護期 |
| 學習曲線 | 較低,像在寫同步代碼 | 極高,需要理解各種操作符與流的概念 |
| 代碼風格 | 順序執行,簡潔明瞭 | 鏈式調用,容易變成「操作符地獄」 |
| 內存佔用 | 極輕量,支持暫停與恢復 | 較重,每個訂閱都會創建不少對象 |
| 適用場景 | 大多數 Android 開發、UI 交互、簡單請求 | 複雜的數據流、多個數據源頻繁組合、背壓處理 |
Kotlin Coroutines:現代開發的首選
如果你使用的是 Kotlin,這幾乎是不二之選。
它的優勢在於結構化並發(Structured Concurrency)。當你在 ViewModel 中使用 viewModelScope.launch 時,如果 ViewModel 銷毀,協程會自動取消。這直接解決了 AsyncTask 最頭痛的內存洩漏問題。
此外,它讓異步代碼看起來像同步代碼。你不需要寫回調,只需要在函數前加一個 suspend 關鍵字,就能在後台執行任務後直接更新 UI,邏輯非常直觀。
RxJava:強大的流式處理工具
RxJava 是一把沉重的重型武器。
如果你的應用需要處理非常複雜的數據流,例如:同時監聽傳感器、網絡狀態與用戶輸入,並將這三者實時組合處理,RxJava 的操作符(如 combineLatest 或 zip)會非常強大。
但在一般的開發場景中,RxJava 的維護成本較高。新人接手時,面對幾十行連在一起的操作符通常會感到崩潰。而且 RxJava 的錯誤處理比較瑣碎,一旦漏掉 onError,程序可能直接崩潰。
遷移建議
如果你是從 AsyncTask 遷移:
- 無腦選擇 Coroutines: 這是目前 Android 開發的標準。它能完美替代
doInBackground(對應withContext(Dispatchers.IO))和onPostExecute(協程自動切回主線程)。 - 考慮團隊成本: 協程的上手時間通常只要幾天,而 RxJava 可能需要幾週甚至幾個月才能熟練應用。
- 庫的整合: 現在的 Retrofit、Room 等主流庫都已經原生支持 Coroutines,遷移阻力極小。