android AsyncTask 除了遷移至 Kotlin Coroutines, 可以改用  Runnable 或 Handler改寫?

替代方案的可行性

可以用 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 來優化這段程式碼以防止記憶體洩漏.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *