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

Android HttpClient 網絡請求報錯?minSdkVersion 14 以上主線程禁用網絡

     編輯:程式設計疑難解答

現象

清單文件設置 android:minSdkVersion="14" android:targetSdkVersion="19" 時,使用 HttpClient 訪問網絡報錯;改為 minSdkVersion="9" 則正常。

核心原因

Android 3.0 (API 11) 引入 StrictMode,預設禁止在主線程執行網絡 I/O。targetSdkVersion >= 11 時嚴格執行,拋出 NetworkOnMainThreadException。

解決方案

方案一:子線程/AsyncTask(舊 API)

new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... params) {
        // 這裡執行 HttpClient 請求
        return executeHttpRequest();
    }
    @Override
    protected void onPostExecute(String result) {
        // 更新 UI
    }
}.execute();

方案二:Thread + Handler

new Thread(() -> {
    String result = executeHttpRequest();
    runOnUiThread(() -> updateUI(result));
}).start();

方案三:遷移至現代網絡庫(強烈推薦)

  • OkHttp:同步/異步均支援,自動處理線程切換。
  • Retrofit + OkHttp:聲明式 API,配合協程/RxJava 最佳。
  • Volley:Google 官方輕量庫,適合簡單請求。

為什麼 minSdkVersion=9 就沒事?

targetSdkVersion 未指定時默認等於 minSdkVersion。targetSdkVersion=9 時系統以「舊應用兼容模式」運行,不強制執行 StrictMode 網絡檢查。但這只是掩蓋問題,不代表代碼正確。

總結

minSdkVersion >= 11 時主線程網絡請求會崩潰,必須移至子線程。建議直接棄用 HttpClient(API 23 已移除),遷移至 OkHttp/Retrofit,從架構層面解決線程與維護難題。

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