安卓与服务器交互流程
- 行业动态
- 2025-04-24
- 2190
基础通信流程
网络请求发起
- 应用通过HTTP/HTTPS协议向服务器发送请求
- 支持GET(获取资源)、POST(提交数据)等方法
- 典型场景:登录验证、数据同步、文件上传
异步处理机制
// 使用Retrofit+RxJava示例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build(); ApiService service = retrofit.create(ApiService.class); service.getUserInfo(userId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::handleResponse, this::handleError);
数据序列化/反序列化
| 数据格式 | 适用场景 | 库支持 |
|———|———|——–|
| JSON | 主流选择 | Gson/Moshi/FastJson |
| Protobuf | 高性能需求 | Google Protocol Buffers |
| XML | 传统接口 | DOM/SAX解析器 |
关键实现组件
网络库对比
| 特性 | OkHttp | Retrofit | Volley |
|—————|———————-|———————|—————-|
| 线程管理 | 手动 | 自动 | 自动 |
| 缓存支持 | 自动 | 需配合Cache-Control | 内存/磁盘 |
| 扩展性 | 中等 | 高(动态代理) | 低 |
| 最佳适用场景 | 复杂请求处理 | RESTful API对接 | 小数据量快速请求 |安全加固措施
- HTTPS配置:强制使用TLS1.2+,配置证书锁定
- 身份认证:JWT Token存储在Secure SharedPreferences
- 数据加密:敏感字段AES加密后传输
- 防抓包:证书绑定(SSL Pinning)
异常处理体系
错误分类处理
| 错误类型 | 处理方案 | 示例代码 |
|———-|———-|———-|
| 网络连接失败 | 自动重试机制 |retryCount=3
|
| 服务器返回4xx | 提示用户修改输入 |showError("参数错误")
|
| 服务器返回5xx | 上报日志并提示重试 |logError(e).showRetry()
|
| JSON解析失败 | 降级处理 |return defaultValue
|超时配置策略
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(15, TimeUnit.SECONDS) // 读取超时 .writeTimeout(15, TimeUnit.SECONDS) // 写入超时 .build();
性能优化方案
流量控制
- 启用GZIP压缩(Content-Encoding: gzip)
- 图片/文件使用Base64编码优化传输
- 分页加载(PageSize=50)
缓存策略
| 缓存类型 | 有效期 | 适用场景 |
|———-|——–|———-|
| 内存缓存 | 10分钟 | 频繁访问数据 |
| 磁盘缓存 | 1小时 | 不常变化数据 |
| WebView缓存 | 按系统设置 | HTML内容 |
相关问题解答
Q1:为什么AndroidManifest需要声明
A:该权限声明是网络通信的必要条件,未声明会导致以下后果:
- 所有网络请求都会被系统拦截
- 应用市场可能拒绝上架(违反最小权限原则)
- 运行时会抛出SecurityException
Q2:Retrofit如何处理多BaseUrl的情况?
A:解决方案对比:
| 方案 | 实现方式 | 适用场景 |
|——|———-|———-|
| 动态BaseUrl | .baseUrl(dynamicUrl)
| 少量不同域名接口 |
| 多实例模式 | 创建多个Retrofit对象 | 长期共存的多域名 |
| 路径拼接 | 使用相对路径+动态参数 | 相同域名不同路径 |
| 自定义转换器 | 编写BaseUrl解析逻辑 | 复杂动态路由需求 |