上一篇
安卓发送网络请求数据
- 行业动态
- 2025-04-22
- 8
安卓发送网络请求的常用方式
原生 HttpURLConnection
- 特点:无需引入第三方库,API 层级较深,需手动处理线程和数据解析。
- 使用步骤:
- 创建
URL
对象。 - 打开
HttpURLConnection
连接。 - 设置请求方法(GET/POST)、超时时间、请求头等。
- 发送数据(POST 需写入
OutputStream
)。 - 读取响应(
InputStream
)。 - 关闭连接。
- 创建
- 代码示例:
URL url = new URL("https://api.example.com/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应流 InputStream inputStream = connection.getInputStream(); // 解析数据... } connection.disconnect();
第三方库 OkHttp
- 特点:轻量高效,支持同步/异步请求,自动管理连接池。
- 核心类:
OkHttpClient
。 - 代码示例:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .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()) { // 处理响应数据 } } });
REST 框架 Retrofit
- 特点:基于 OkHttp,支持注解定义接口,自动生成请求代码,适合 RESTful API。
- 核心步骤:
- 定义接口(用注解标记请求方法)。
- 创建
Retrofit
实例。 - 创建接口实现类并发送请求。
- 代码示例:
public interface ApiService { @GET("data") Call<ResponseBody> getData(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); apiService.getData().enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { / 处理响应 / } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { / 处理失败 / } });
图片加载库 Volley
- 适用场景:轻量级网络请求,尤其适合图片加载。
- 核心类:
RequestQueue
、StringRequest
、JsonObjectRequest
。 - 代码示例:
RequestQueue queue = Volley.newRequestQueue(context); StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://api.example.com/data", response -> { / 处理成功 / }, error -> { / 处理错误 / }); queue.add(stringRequest);
网络权限配置
- AndroidManifest.xml 中声明权限:
<uses-permission android:name="android.permission.INTERNET" />
- 动态权限申请(Android 6.0+):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_CODE); }
异步处理网络请求
方式 | 特点 |
---|---|
AsyncTask |
简化异步任务,但已被弃用(推荐用其他方式替代)。 |
Handler + Thread |
手动管理线程和消息队列,灵活性高但代码复杂。 |
线程池 |
复用线程资源,适合高频请求。 |
协程(Kotlin) |
轻量级并发,主线程安全,推荐现代 Android 开发使用。 |
数据解析与封装
- JSON 解析:
Gson
、Jackson
、Moshi
。 - XML 解析:
PullParser
、SAX
、DOM
。 - 数据封装:将响应数据映射为 Java/Kotlin 对象(如 Gson 的
fromJson
)。
常见错误处理
错误类型 | 解决方案 |
---|---|
网络不可用 | 检查设备网络状态,提示用户检查网络。 |
超时异常 | 设置合理的连接/读取超时时间,或重试机制。 |
SSL 证书验证失败 | 信任特定证书或使用 HTTP(不推荐生产环境)。 |
数据格式错误 | 校验服务器返回的 Content-Type,增加异常捕获逻辑。 |
相关问题与解答
问题 1:如何选择合适的网络请求库?
- 解答:
- 简单请求:
HttpURLConnection
或Volley
。 - 复杂 API:
Retrofit
(支持注解和自动解析)。 - 高性能需求:
OkHttp
(可搭配 Retrofit 使用)。 - Kotlin 项目:优先使用协程(
suspend
函数简化异步代码)。
- 简单请求:
问题 2:如何保证网络请求的安全性?
- 解答:
- 使用 HTTPS:避免明文传输敏感数据。
- 证书校验:确保服务器证书合法,防止中间人攻击。
- 数据加密:对敏感数据(如密码)进行加密后再传输。
- 权限控制:动态申请敏感权限,避免权限