在Android中,处理网络请求异常通常涉及到以下几个方面:
ConnectivityManager
类来检查网络连接状态。ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
boolean isConnected = activeNetworkInfo != null && activeNetworkInfo.isConnected();
UnknownHostException
。你可以捕获这个异常并进行相应的处理。try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// ...
} catch (UnknownHostException e) {
e.printStackTrace();
// 处理异常,例如显示错误消息给用户
}
SocketTimeoutException
。你可以捕获这个异常并进行相应的处理。try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000); // 设置连接超时时间
connection.setReadTimeout(5000); // 设置读取数据超时时间
// ...
} catch (SocketTimeoutException e) {
e.printStackTrace();
// 处理异常,例如显示错误消息给用户
}
HttpURLConnection
类可能会抛出其他异常,如ProtocolException
、IOException
等。你需要捕获这些异常并进行相应的处理。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) {
// 处理成功的响应
} else {
// 处理错误的响应
}
} catch (ProtocolException e) {
e.printStackTrace();
// 处理异常,例如显示错误消息给用户
} catch (IOException e) {
e.printStackTrace();
// 处理异常,例如显示错误消息给用户
}
HttpURLConnection
类外,你还可以考虑使用更高级别的网络库,如Retrofit
、OkHttp
等。这些库通常提供了更好的异常处理和更简洁的API。例如,在使用OkHttp
时,你可以通过Call
对象的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();
// 处理异常,例如显示错误消息给用户
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
// 处理错误的响应
} else {
// 处理成功的响应
}
}
});
请注意,enqueue
方法是在后台线程中执行网络请求的,因此你不需要担心阻塞主线程。同时,它也允许你更好地处理网络请求的异步性质和异常情况。