上一篇
安卓开发获取数据接口
- 行业动态
- 2025-04-22
- 8
HTTP请求基础
使用 HttpURLConnection
- 步骤:创建连接 -> 设置请求方法(GET/POST)-> 设置请求头 -> 发送请求 -> 读取响应
- 代码示例:
URL url = new URL("https://api.example.com/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); // 读取输入流并解析数据 }
使用第三方库(如 OkHttp)
- 优势:简化代码、支持缓存、自动处理重定向
- 代码示例:
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()) { String responseBody = response.body().string(); // 解析数据 } } });
常用网络请求库对比
库名 | 特点 | 适用场景 |
---|---|---|
Retrofit | 基于 OkHttp,支持注解、自动解析 JSON/XML、支持 RxJava | 复杂 API 调用、强类型安全 |
Volley | 轻量级、支持图片加载、内置缓存机制 | 简单请求、快速开发 |
OkHttp | 高性能、支持 WebSocket、拦截器机制 | 需要自定义网络逻辑的场景 |
Fetch API | Android 12+ 提供的原生 API,支持 Promise 风格 | 新项目且兼容高版本系统 |
异步处理与线程管理
传统方式(AsyncTask
)
- 注意:已被弃用,建议使用新方案
- 替代方案:
- Kotlin Coroutines:
viewLifecycleOwner.lifecycleScope.launch { val result = withContext(Dispatchers.IO) { // 网络请求或耗时操作 } // 更新UI }
- LiveData + ViewModel:
// 在 ViewModel 中发起请求 liveData.postValue(fetchDataFromNetwork());
- Kotlin Coroutines:
WorkManager
- 用途:处理延迟任务、周期性任务(如同步数据)
- 代码示例:
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class) .setConstraints(Constraints.connectivityConstraint(ConnectivityType.CONNECTED)) .build(); WorkManager.getInstance(context).enqueue(workRequest);
数据解析与存储
JSON解析
- Gson:
Gson gson = new Gson(); MyData[] data = gson.fromJson(jsonString, MyData[].class);
- Moshi:
val moshi = Moshi.Builder().build() val jsonAdapter = moshi.adapter(MyData::class.java) val data = jsonAdapter.fromJson(jsonString)
本地存储
存储方式 | 特点 | 适用场景 |
---|---|---|
SharedPreferences | 轻量级键值对存储 | 简单配置信息 |
SQLite/Room | 结构化数据存储、支持复杂查询 | 离线数据持久化 |
DataStore | Jetpack 提供的轻量级键值存储(替代 SP) | 现代替代方案,支持协议 |
常见问题与解决方案
网络权限未声明
- 症状:应用崩溃或无法联网
- 解决:在
AndroidManifest.xml
中添加:<uses-permission android:name="android.permission.INTERNET" />
HTTPS证书验证失败
- 原因:自签名证书或服务器证书不被信任
- 解决:在 OkHttp 中配置忽略验证(仅限测试环境):
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new TrustManagerFactory().trustManagers(TrustManagerFactory.getDefaultAlgorithm())) .hostnameVerifier((hostname, session) -> true) .build();
相关问题与解答
问题1:如何选择 Retrofit 和 Volley?
- 解答:
- Retrofit:适合需要强类型安全、复杂 API 调用(如带认证、动态参数)的场景,尤其推荐与 RxJava/Coroutines 结合。
- Volley:适合简单请求(如图片加载、小数据量传输),内置缓存机制可提升性能。
问题2:如何在不阻塞主线程的情况下更新 UI?
- 解答:
- Kotlin Coroutines:使用
lifecycleScope.launch
或viewModelScope
在后台线程执行任务,自动切换到主线程更新 UI。 - LiveData/ViewModel:在 ViewModel 中处理数据,通过
LiveData
观察数据变化并自动更新 UI。 - Handler/Looper:手动切换线程(不推荐,代码复杂度高
- Kotlin Coroutines:使用