替代方案的可行性
可以用 Runnable 搭配 Handler 改寫。
這在協程普及前是很常見的做法。
原理是自己管理執行緒切換。
Runnable 負責定義要做的任務。
Handler 負責跨執行緒溝通。
具體的執行方式
你需要先準備一個 ExecutorService 執行緒池。
把耗時工作放進 Runnable 裡面。
透過 executor.execute 丟到背景執行。
當資料處理完畢。
再利用 Handler 的 post 方法切換回主執行緒。
這樣就能安全地更新介面元件。
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(new Runnable() {
@Override
public void run() {
// 這裡跑背景任務
final String data = "載入完成";
handler.post(new Runnable() {
@Override
public void run() {
// 這裡更新 UI
textView.setText(data);
}
});
}
});
優缺點評估
這種做法控制權最高。
適合不支援 Kotlin 的老舊專案。
但是程式碼會變得很碎。
也要特別注意記憶體洩漏問題。
建議將 Handler 宣告為靜態類別。
才不會意外持有 Activity 的引用。
如果是簡單的任務。
這比導入整個協程庫還要輕量。
可以再利用 WeakReference 來優化這段程式碼以防止記憶體洩漏.