上一篇
安卓如何调用网络数据
- 行业动态
- 2025-04-22
- 4
安卓网络请求基础配置
添加网络权限
在AndroidManifest.xml
中声明网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
网络线程规范
所有网络请求必须在非主线程执行,避免阻塞UI线程,常用解决方案:
AsyncTask
(已过时,建议使用Jetpack组件)HandlerThread
Coroutine
(推荐现代开发方式)WorkManager
(适合延迟任务)
主流网络请求实现方式
方式 | 适用场景 | 特点 |
---|---|---|
HttpURLConnection | 简单GET/POST请求 | Android原生API,无需第三方库,适合轻量级请求 |
OkHttp | 复杂网络交互 | 高效连接池管理,支持WebSocket,广泛兼容 |
Retrofit | RESTful API接口开发 | 面向接口编程,强类型支持,与OkHttp深度集成 |
Volley | 图片加载/短轮询 | 内置缓存机制,适合小规模数据交互 |
代码实现示例
使用HttpURLConnection发送GET请求
// 创建子线程执行网络请求 new Thread(() -> { try { URL url = new URL("https://api.example.com/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 读取响应 InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 回到主线程更新UI runOnUiThread(() -> { tvResult.setText(response.toString()); }); } catch (IOException e) { e.printStackTrace(); } }).start();
使用OkHttp发送带Header的POST请求
OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create( MediaType.parse("application/json"), "{"key":"value"}"); Request request = new Request.Builder() .url("https://api.example.com/post") .post(body) .addHeader("Authorization", "Bearer token") .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 { final String res = response.body().string(); runOnUiThread(() -> tvResult.setText(res)); // 更新UI } });
使用Retrofit定义API接口
// 1. 定义接口 public interface ApiService { @GET("users/{id}") Call<User> getUser(@Path("id") int id); @POST("login") Call<Token> login(@Body LoginParams params); } // 2. 创建Retrofit实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); // 3. 调用接口 ApiService api = retrofit.create(ApiService.class); Call<User> call = api.getUser(123); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { // 处理成功响应 } @Override public void onFailure(Call<User> call, Throwable t) { // 处理失败 } });
数据解析与异常处理
数据类型 | 解析工具 | 示例代码 |
---|---|---|
JSON对象 | JSONObject | JSONObject json = new JSONObject(response) |
JSON数组 | JSONArray | JSONArray array = json.getJSONArray("data") |
复杂对象 | Gson/Jackson | User user = gson.fromJson(json, User.class) |
XML数据 | DocumentBuilder | Document doc = DocumentBuilderFactory... |
异常处理要点:
- 检查网络连接状态:
ConnectivityManager.getActiveNetworkInfo()
- 处理HTTP错误码:
response.code()
判断4xx/5xx状态码 - 超时设置:
connection.setConnectTimeout(10, TimeUnit.SECONDS)
- SSL证书验证:配置
SSLSocketFactory
或信任所有证书(慎用)
常见问题与优化策略
问题类型 | 解决方案 |
---|---|
内存泄漏 | 使用静态内部类+弱引用,或生命周期感知组件(LifecycleObserver) |
重复请求 | 使用OkHttp的CacheControl 或本地缓存机制 |
流量优化 | 压缩数据传输(GZIP)、设置缓存策略、按需加载数据 |
安全加固 | 启用HTTPS、证书锁定、数据加密传输 |
【相关问题解答】
Q1:安卓11及以上系统如何处理后台网络请求?
A1:安卓11引入了更严格的后台网络限制,需注意:
- 使用
WorkManager
替代传统AlarmManager - 申请
SCHEDULE_EXACT_ALARM
特权(仅限必要场景) - 使用
ForegroundService
保持网络任务优先级 - 优化请求频率,合并网络请求减少功耗
Q2:如何选择合适的网络库?
A2:根据项目需求选择:
- 简单Demo/快速开发:Volley(内置缓存,适合小数据量)
- 复杂API对接:Retrofit(强类型,接口化开发)
- 高性能长连接:OkHttp(支持WebSocket,连接复用)
- 跨平台方案:Ktor(Kotlin多平台支持)