上一篇
安卓和服务器交互
- 行业动态
- 2025-04-23
- 2
安卓通过HTTP/HTTPS协议与服务器交互,使用JSON传输数据,借助Retrofit等库实现API调用及数据交换
安卓与服务器交互的核心要点
网络请求基础
- HTTP协议:安卓与服务器交互主要基于HTTP/HTTPS协议。
- 请求方式:
- GET:获取数据,参数拼接在URL中。
- POST:提交数据,参数放在请求体中。
- 工具类:
HttpURLConnection
(原生):需手动处理线程和数据流。OkHttp
:第三方库,支持异步、缓存、拦截器等。Retrofit
:基于OkHttp的RESTful API封装,支持注解和数据转换。
数据格式与解析
格式 | 特点 | 适用场景 | 安卓解析工具 |
---|---|---|---|
JSON | 轻量级,易读写 | 通用数据交换 | Gson 、Jackson 、Moshi |
XML | 结构化,标签明确 | 复杂配置数据 | SAX 、DOM 、PullParser |
Protobuf | 二进制,高效 | 高频实时通信 | Google Protocol Buffers |
示例(JSON解析):
// 使用Gson解析JSON字符串 Gson gson = new Gson(); User user = gson.fromJson(jsonString, User.class);
身份验证与安全
- Token机制:
- 服务器返回
access_token
和refresh_token
。 - 每次请求携带
Authorization: Bearer <token>
。 - Token过期后,用
refresh_token
重新获取。
- 服务器返回
- HTTPS:强制使用SSL/TLS加密通信,防止中间人攻击。
- 数据签名:敏感操作(如支付)需服务器校验签名。
异步处理与线程管理
- 主线程限制:Android禁止在主线程执行网络请求(
NetworkOnMainThreadException
)。 - 解决方案:
AsyncTask
(已过时,建议弃用)。Handler+Thread
:手动管理子线程。Retrofit+RxJava
:基于观察者模式异步回调。Kotlin Coroutines
:协程简化异步代码。
示例(Retrofit+协程):
// 定义接口 interface ApiService { @GET("user/info") suspend fun getUserInfo(): Response<User> } // 调用方式 viewModelScope.launch { val user = apiService.getUserInfo().body() // 更新UI }
错误处理与容错
- 常见错误类型:
- 网络错误:无网络、DNS解析失败。
- 服务器错误:500系列状态码。
- 数据错误:JSON解析异常、字段缺失。
- 处理策略:
- 检查网络连接(
ConnectivityManager
)。 - 对HTTP状态码分类处理(如401需重新登录)。
- 捕获
IOException
、JsonParseException
等异常。 - 重试机制:指数退避(Exponential Backoff)。
- 检查网络连接(
性能优化
- 缓存策略:
- 内存缓存:
LruCache
存储频繁数据(如用户信息)。 - 磁盘缓存:
OkHttp
缓存或Room
数据库存储静态资源。
- 内存缓存:
- 分页加载:避免一次性请求大数据集(如
PageKeyedDataSource
)。 - 数据压缩:启用Gzip压缩减少传输体积。
相关问题与解答
问题1:如何处理Token过期导致的401错误?
解答:
- 捕获服务器返回的401状态码。
- 检查
refresh_token
是否有效。 - 若有效,调用刷新接口获取新
access_token
。 - 重新发起原请求(需缓存原请求参数)。
- 若刷新失败,跳转登录页面。
问题2:如何选择JSON还是Protobuf作为数据格式?
解答:
- JSON:适合通用场景,可读性强,调试方便。
- Protobuf:适合高频实时通信(如实时聊天、游戏),占用带宽小、解析速度快。
- 建议:对性能敏感且数据结构稳定的场景用Protobuf,其他场景优先JSON