在Android中,處理網(wǎng)絡(luò)請(qǐng)求異常通常涉及到以下幾個(gè)方面:
ConnectivityManager
類來(lái)檢查網(wǎng)絡(luò)連接狀態(tài)。ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
boolean isConnected = activeNetworkInfo != null && activeNetworkInfo.isConnected();
UnknownHostException
。你可以捕獲這個(gè)異常并進(jìn)行相應(yīng)的處理。try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// ...
} catch (UnknownHostException e) {
e.printStackTrace();
// 處理異常,例如顯示錯(cuò)誤消息給用戶
}
SocketTimeoutException
。你可以捕獲這個(gè)異常并進(jìn)行相應(yīng)的處理。try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000); // 設(shè)置連接超時(shí)時(shí)間
connection.setReadTimeout(5000); // 設(shè)置讀取數(shù)據(jù)超時(shí)時(shí)間
// ...
} catch (SocketTimeoutException e) {
e.printStackTrace();
// 處理異常,例如顯示錯(cuò)誤消息給用戶
}
HttpURLConnection
類可能會(huì)拋出其他異常,如ProtocolException
、IOException
等。你需要捕獲這些異常并進(jìn)行相應(yīng)的處理。try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// ...
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 處理成功的響應(yīng)
} else {
// 處理錯(cuò)誤的響應(yīng)
}
} catch (ProtocolException e) {
e.printStackTrace();
// 處理異常,例如顯示錯(cuò)誤消息給用戶
} catch (IOException e) {
e.printStackTrace();
// 處理異常,例如顯示錯(cuò)誤消息給用戶
}
HttpURLConnection
類外,你還可以考慮使用更高級(jí)別的網(wǎng)絡(luò)庫(kù),如Retrofit
、OkHttp
等。這些庫(kù)通常提供了更好的異常處理和更簡(jiǎn)潔的API。例如,在使用OkHttp
時(shí),你可以通過Call
對(duì)象的enqueue
方法處理異常:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.example.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
// 處理異常,例如顯示錯(cuò)誤消息給用戶
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
// 處理錯(cuò)誤的響應(yīng)
} else {
// 處理成功的響應(yīng)
}
}
});
請(qǐng)注意,enqueue
方法是在后臺(tái)線程中執(zhí)行網(wǎng)絡(luò)請(qǐng)求的,因此你不需要擔(dān)心阻塞主線程。同時(shí),它也允許你更好地處理網(wǎng)絡(luò)請(qǐng)求的異步性質(zhì)和異常情況。