Android网络请求工具类选择
工具类 | 特点 | 适用场景 |
HttpURLConnection | 原生API,需手动处理连接、流操作 | 简单请求,学习底层原理 |
OkHttp | 第三方库,支持连接池、缓存、自动压缩 | 复杂网络请求,高性能 |
Retrofit | 基于OkHttp,通过注解生成接口,支持数据转换(Gson/XML等) | RESTful API对接 |
Volley | Google官方推荐,适合小数据量、频繁网络请求(如列表加载) | 轻量级网络操作 |
发送GET请求数据包
使用HttpURLConnection
发送GET请求
// 1. 创建URL对象
URL url = new URL("https://api.example.com/data?param1=value1¶m2=value2");
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法
connection.setRequestMethod("GET");
// 4. 设置请求头(可选)
connection.setRequestProperty("Accept", "application/json");
// 5. 发起请求并获取响应码
int responseCode = connection.getResponseCode();
// 6. 读取响应数据
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
// 解析输入流(如JSON/XML)
} else {
// 处理错误响应
}
// 7. 关闭连接
connection.disconnect();
使用OkHttp
发送GET请求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/data?param1=value1¶m2=value2")
.addHeader("Accept", "application/json")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 处理失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String jsonData = response.body().string();
// 解析JSON数据
} else {
// 处理错误响应
}
}
});
发送POST请求数据包
使用HttpURLConnection
发送POST请求(带参数)
// 1. 创建URL对象
URL url = new URL("https://api.example.com/data");
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法为POST
connection.setRequestMethod("POST");
// 4. 启用输出流
connection.setDoOutput(true);
// 5. 设置请求头
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 6. 写入参数数据
String params = "param1=value1¶m2=value2";
OutputStream os = connection.getOutputStream();
os.write(params.getBytes());
os.flush();
os.close();
// 7. 获取响应码并处理响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 读取响应数据
} else {
// 处理错误响应
}
connection.disconnect();
使用OkHttp
发送POST请求(带JSON数据)
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String json = "{"param1":"value1","param2":"value2"}";
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url("https://api.example.com/data")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 处理失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String responseData = response.body().string();
// 解析响应数据
} else {
// 处理错误响应
}
}
});
异步处理与线程管理
方式 | 说明 |
AsyncTask | 已过时,但仍可用于简单异步任务(Android 11+需注意限制) |
Handler+Thread | 手动管理线程,适用于简单场景 |
RxJava | 响应式编程,适合复杂异步链式调用 |
Kotlin Coroutine | 协程,轻量级线程管理,推荐现代开发方式(需Kotlin语言) |
Kotlin协程示例(发送网络请求)
// 在ViewModel或LifecycleScope中调用
viewModelScope.launch {
try {
val response = withContext(Dispatchers.IO) {
client.newCall(request).execute() // OkHttp同步调用
}
if (response.isSuccessful) {
// 处理UI更新(需切换到主线程)
}
} catch (e: Exception) {
// 处理异常
}
}
数据解析与封装
数据类型 | 解析工具 | 示例代码 |
JSON | Gson /Moshi /Jackson | Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class); |
XML | XmlPullParser /Simple | 使用XmlPullParser 逐行解析或Simple 框架映射对象 |
Protobuf | Google Protocol Buffer | 定义.proto 文件后生成Java类,直接序列化/反序列化 |
常见问题与解决方案
问题描述 | 解决方案 |
网络权限未声明 | 在AndroidManifest.xml 中添加<uses-permission android:name="android.permission.INTERNET"/> |
主线程网络操作导致ANR | 使用异步任务(如协程、AsyncTask 、Handler )处理网络请求 |
SSL证书验证失败 | 信任所有证书(开发环境):client.sslSocketFactory(trustAllCertificates()) |
POST请求参数丢失 | 确保Content-Type 正确(如application/json 或x-www-form-urlencoded ) |
大文件上传失败 | 使用MultipartBody 分片上传,或开启ChunkedEncoding |
相关问题与解答
问题1:如何选择HTTP客户端库(OkHttp vs Retrofit)?
解答:
- OkHttp:适合需要精细控制连接、拦截器、缓存的场景,灵活性高。
- Retrofit:基于OkHttp,通过注解自动生成接口,适合RESTful API快速开发,减少模板代码。
建议:若API接口固定且需要数据转换(如JSON),优先使用Retrofit;若需要自定义连接逻辑,选择OkHttp。
问题2:如何处理网络请求的超时和重试?
解答: