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

Android 子線程網絡請求必要性:主線程 ANR 與 Android 4.0+ NetworkOnMainThreadException

     編輯:程式設計綜合問答

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

  1. ANR (Application Not Responding):主線程負責 UI 繪製、事件分發,網絡 I/O 阻塞超過 5 秒系統彈出 ANR 對話框,用戶體驗極差。
  2. Android 4.0 (API 14) 起強制檢查:StrictMode 檢測到主線程網絡操作直接拋出 NetworkOnMainThreadException 崩潰。

正確模式

  1. 新建 Thread / Runnable 執行網絡請求。
  2. Handler / runOnUiThread / LiveData / RxJava / 協程 將結果切回主線程更新 UI。

代碼示例 (Handler)

new Thread(() -> {
    try {
        String result = HttpUtils.get(url); // 耗時操作
        Message msg = handler.obtainMessage(MSG_SUCCESS, result);
        handler.sendMessage(msg);
    } catch (IOException e) {
        handler.sendEmptyMessage(MSG_ERROR);
    }
}).start();

Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == MSG_SUCCESS) {
            listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, (List) msg.obj));
        }
    }
};

關於 sleep 延遲

示例中 SystemClock.sleep 僅為模擬網絡延遲,**實際開發中不應人為 sleep**,而是依賴網絡庫的超時設置與回調機制。

總結

主線程只做 UI,耗時操作 (網絡、DB、IO、複雜計算) 全部拋給子線程,結果通過消息/回調/流 回主線程,這是 Android 開發鐵律。

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