使用 AsyncHttpClient (LoopJ/Android-Async-Http) 請求時拋出 ConnectTimeoutException 或 SocketTimeoutException。
這是網絡層面的連接/讀取超時,通常不是客戶端代碼邏輯錯誤。 客戶端超時時間設置合理 (默認 10s-30s) 的前提下,超時意味著:**TCP 三次握手失敗、或服務端無響應、或中間鏈路阻斷。**
| 順序 | 檢查項 | 操作方法 | 常見原因 |
|---|---|---|---|
| 1 | **服務端是否存活** | 瀏覽器/Postman/curl 直接訪問 API URL | 服務挂起、OOM、死鎖、部署失敗、端口未啟動 |
| 2 | **網絡連通性** | 手機/模擬器瀏覽器訪問同 URL;ping 域名/IP;telnet ip port | 無網絡、WiFi 需認證、代理/VPN 干擾、DNS 解析失敗、防火牆/安全組阻擋 |
| 3 | **域名解析** | nslookup domain 或瀏覽器訪問 IP 直連 | DNS 污染、域名過期、內網 DNS 未配置 |
| 4 | **服務端響應時間** | Postman 查看響應耗時;服務端日誌查看處理耗時 | 慢 SQL、死鎖、外部依賴超時、GC 停頓、線程池耗盡 |
| 5 | **客戶端超時設置** | 檢查 setConnectTimeout/setTimeout 是否過小 (如 1s) | 代碼中設置了不合理的極短超時 |
| 6 | **HTTPS/證書問題** | HTTPS 請求是否信任證書;Charles/Fiddler 抓包看握手 | 自簽名證書未信任、證書過期、域名不匹配、SNI 配置錯誤 |
| 7 | **攔截器/中間件** | Nginx/網關/防火牆日誌查看是否攔截/限流 | IP 限流、WAF 誤攔、請求頭過大、Body 限制 |
AsyncHttpClient client = new AsyncHttpClient();
// 合理設置超時 (連接 10s, 讀取 20s)
client.setConnectTimeout(10000);
client.setTimeout(20000);
// 可選:重試機制 (需依賴庫版本支持或自行封裝)
// client.setMaxRetriesAndTimeout(3, 1000); // 部分版本支持
client.get(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
// 處理成功
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
if (error instanceof ConnectTimeoutException || error instanceof SocketTimeoutException) {
Log.e("HTTP", "網絡請求超時,請檢查網絡或稍後重試");
// UI 提示用戶重試
} else {
Log.e("HTTP", "請求失敗: " + error.getMessage());
}
}
});
LoopJ AsyncHttpClient 已停止維護多年 (最後更新 2018)。 新項目**強烈建議**使用:
遷移後可獲得:連接池復用、HTTP/2、自動重試、攔截器、取消請求、TLS 1.3 等現代特性。
AsyncHttpClient 超時 90% 是網絡/服務端問題,非客戶端代碼錯誤。 按「服務端存活 → 網絡通達 → 域名解析 → 響應耗時 → 客戶端配置」順序排查。**強烈建議新項目遷移至 OkHttp/Retrofit**,徹底解決舊庫維護缺失帶來的潛在風險。