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

Android 4.0+ 主執行緒網路請求崩潰與逾時:正確使用背景執行緒

     編輯:程式設計綜合問答

錯誤演進

  1. NetworkOnMainThreadException:Android 3.0+ 嚴禁主執行緒網路 IO。
  2. 加入 StrictMode.ThreadPolicy.Builder().permitAll() 繞過檢查,但真機出現 SocketTimeoutException(5 秒預設逾時)。

根本原因

StrictMode 只是關閉「主執行緒網路」偵測,**並未解決網路阻塞 UI** 的問題。真機網路較慢,主執行緒阻塞導致 ANR 或逾時。

正確做法


// 方案一:Thread + Handler
new Thread(() -> {
    try { String result = httpGet(url); }
    catch (IOException e) { e.printStackTrace(); }
    runOnUiThread(() -> updateUI(result));
}).start();

// 方案二:OkHttp + Callback(推薦)
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder().url(url).build();
client.newCall(req).enqueue(new Callback() {
    onFailure(...) { runOnUiThread(() -> showError()); }
    onResponse(...) { runOnUiThread(() -> parseAndShow(response.body().string())); }
});

關鍵點

  • 所有網路 IO、耗時運算必須在背景執行緒。
  • UI 更新必須切回主執行緒(runOnUiThread、Handler、LiveData 等)。
  • 設定合理的連線/讀取逾時(OkHttpClient.Builder().connectTimeout(10, SECONDS))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved