上一篇
安卓从服务器获取json
- 行业动态
- 2025-04-24
- 1
安卓获取JSON需配置网络权限,使用HttpURLConnection/OkHttp发起请求,读取输入流并解析为 JSONObject/JSONArray,注意处理异常及异步操作防止主线程阻塞
安卓从服务器获取JSON数据详解
前置准备
添加网络权限
在AndroidManifest.xml
中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
选择网络库
- 原生方式:
HttpURLConnection
(需手动处理线程和异常) - 第三方库:
OkHttp
(轻量级)、Retrofit
(封装更完善)
- 原生方式:
使用 OkHttp 获取 JSON 数据
添加依赖
在 build.gradle
中添加 OkHttp 依赖:
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
创建异步任务
// 示例:从 https://api.example.com/data 获取 JSON new Thread(() -> { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { String json = response.body().string(); // 解析 JSON(见下文) } else { // 处理错误码(如 404、500) } } catch (IOException e) { e.printStackTrace(); } }).start();
解析 JSON 数据
使用 Gson 库
添加依赖:
implementation 'com.google.code.gson:gson:2.10'
定义数据模型类:
// 假设 JSON 格式为:{"name":"张三","age":25} public class User { private String name; private int age; // Getter 和 Setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
解析 JSON:
Gson gson = new Gson(); User user = gson.fromJson(json, User.class); // json 是上一步获取的字符串
完整流程(带 UI 更新)
// 在 Activity 中执行 new Thread(() -> { try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("https://api.example.com/data").build(); Response response = client.newCall(request).execute(); String json = response.body().string(); // 切换到主线程更新 UI runOnUiThread(() -> { User user = gson.fromJson(json, User.class); textView.setText("姓名:" + user.getName() + ",年龄:" + user.getAge()); }); } catch (IOException e) { e.printStackTrace(); } }).start();
常见问题与解决方案
问题 | 解决方案 |
---|---|
网络请求阻塞主线程 | 使用子线程(如 new Thread )或异步框架(如 Retrofit + RxJava) |
JSON 解析失败 | 检查 JSON 格式是否与模型类匹配,或使用 TypeToken 处理复杂结构(如泛型) |
HTTPS 证书错误 | 在 OkHttpClient 中配置信任所有证书(仅限测试环境) |
相关问题与解答
问题 1:如何信任所有 HTTPS 证书(测试用途)?
解答:
在 OkHttpClient 中配置 SSLSocketFactory
:
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new TrustManagerFactory().trustAllCerts(), new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }) .hostnameVerifier((hostname, session) -> true) // 禁用主机名验证 .build();
注意:此方法仅用于测试,生产环境需正确校验证书。
问题 2:Retrofit 如何配置缓存?
解答:
在 OkHttpClient 中添加缓存配置,并传入 Retrofit:
// 设置缓存目录和大小(10MB) Cache cache = new Cache(new File(context.getCacheDir(), "http_cache"), 10 1024 1024); OkHttpClient client = new OkHttpClient.Builder() .cache(cache) // 启用缓存 .build(); Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build();
说明:Retrofit 会自动处理缓存逻辑,需在服务器响应头中配置 Cache-Control