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

Android 網絡請求必須子線程:主線程網絡操作導致 ANR 崩潰

     編輯:程式設計綜合問答

為什麼不能在主線程請求網絡

  1. ANR (Application Not Responding):主線程阻塞超過 5 秒系統彈出強制關閉對話框;
  2. Android 4.0+ (API 11+) 強制檢查:StrictMode 檢測到主線程網絡 I/O 直接拋出 NetworkOnMainThreadException 崩潰;
  3. UI 渲染、事件分發均在主線程,網絡阻塞會凍結整個界面。

正確模式

new Thread(() -> {
    // 1. 子線程執行網絡請求
    String result = HttpUtils.get(url);
    // 2. 通過 Handler/RunOnUiThread 回主線程更新 UI
    runOnUiThread(() -> {
        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, parse(result)));
    });
}).start();

現代替代方案

  • Kotlin 協程:withContext(Dispatchers.IO) { ... };
  • RxJava:subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
  • Retrofit + Coroutines/Flow:聲明式、結構化併發;
  • AsyncTask (已棄用):簡單場景可用,但有生命周期洩漏風險。

關於 sleep 延遲

示例中 SystemClock.sleep 僅為模擬網絡延遲,**實際開發中不應人為睡眠**,應依賴回調/掛起機制等待響應。

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