首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android AsyncTask onPostExecute 不執行:主線程阻塞導致回調無法分發

     編輯:程式設計綜合問答

問題代碼

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

AsyncTask 改造示例


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);
    }
}

總結

絕不在主線程同步等待異步任務,使用回調、協程、響應式流等非阻塞模式處理異步結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved