public void click() {
new Load().execute();
while (wait) { ; } // 主線程死循環阻塞,Handler 消息無法處理
}
AsyncTask 的 onPostExecute 通過 Handler 發送到主線程消息隊列。若主線程被 while(wait) 佔用,消息永不被取出執行,導致回調不執行、ANR。
// 1. 接口回調
new Load(result -> {
// 處理結果
}).execute();
// 2. 協程 (推薦)
lifecycleScope.launch {
val result = withContext(Dispatchers.IO) { doBackgroundWork() }
updateUI(result)
}
// 3. LiveData / RxJava / CompletableFuture
public class Load extends AsyncTask {
private Consumer onFinish;
public Load(Consumer onFinish) { this.onFinish = onFinish; }
@Override protected String doInBackground(Void... v) { return doWork(); }
@Override protected void onPostExecute(String result) {
if (onFinish != null) onFinish.accept(result);
}
}
絕不在主線程同步等待異步任務,使用回調、協程、響應式流等非阻塞模式處理異步結果。