NetworkOnMainThreadException:Android 3.0+ 嚴禁主執行緒網路 IO。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())); }
});
runOnUiThread、Handler、LiveData 等)。OkHttpClient.Builder().connectTimeout(10, SECONDS))。