上一篇
安卓与服务器端通信
- 行业动态
- 2025-04-24
- 3702
安卓与服务器端通信主要通过HTTP/HTTPS协议实现,采用GET、POST等请求方式,借助Retrofit、OkHttp等网络库完成数据交互,通常以JSON格式传输结构化
安卓与服务器端通信基础
通信方式
安卓客户端与服务器端通信的核心是通过网络协议传输数据,常见的方式包括:
- HTTP/HTTPS:基于TCP/IP协议,最常用的请求方式(GET、POST等)。
- WebSocket:支持全双工通信,适合实时交互场景。
- Socket:底层TCP/UDP通信,灵活性高但需手动处理协议。
关键实现步骤
步骤 | 说明 | 代码示例(OkHttp) |
---|---|---|
添加网络权限 | 在AndroidManifest.xml 中声明权限 | <uses-permission android:name="android.permission.INTERNET"/> |
创建请求对象 | 构建HTTP请求(带参数、头信息等) | “`java |
Request request = new Request.Builder()
.url(“https://api.example.com/data”)
.addHeader(“Authorization”, “Bearer token”)
.build();
| 3. 发送请求 | 同步/异步调用(推荐异步) | ```java
OkHttpClient client = new OkHttpClient();<br>client.newCall(request).enqueue(new Callback() {<br> @Override public void onResponse(Call call, Response response) throws IOException {<br> // 处理响应<br> }<br> @Override public void onFailure(Call call, IOException e) {<br> // 处理失败<br> }<br>});
``` |
| 4. 处理响应 | 解析服务器返回的数据(JSON/XML等) | ```java
String jsonData = response.body().string();<br>Gson gson = new Gson();<br>DataModel data = gson.fromJson(jsonData, DataModel.class);
``` |
# 3. 异步处理方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|------|------|------|----------|
| AsyncTask | 简单易用,UI线程更新方便 | 生命周期依赖Activity,易导致内存泄漏 | 简单短时间任务 |
| Handler+Thread | 灵活控制线程 | 代码复杂,需手动管理线程 | 中等复杂度任务 |
| RxJava | 链式调用,线程切换方便 | 学习成本较高 | 复杂异步流程 |
| Kotlin Coroutines | 语法简洁,轻量级 | 需掌握协程原理 | 现代安卓开发首选 |
# 4. 数据格式与解析
| 数据类型 | 解析工具 | 示例代码 |
|----------|----------|----------|
| JSON | Gson/Jackson/Moshi | ```java
Gson gson = new Gson();<br>User user = gson.fromJson(jsonString, User.class);
``` |
| XML | DOM/SAX解析器 | ```java
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();<br>Document doc = builder.parse(inputStream);
``` |
| Protobuf | Google Protocol Buffers | ```java
Person person = Person.parseFrom(byteArray);
``` |
# 5. 安全与优化
HTTPS强制验证:配置服务器SSL证书,客户端启用证书锁定
请求优化:
使用`OkHttp`的连接池复用机制
添加拦截器实现统一签名/加密
设置超时时间(`setConnectTimeout/setReadTimeout`)
流量压缩:启用GZIP压缩(需服务器支持)
常见问题与解答
# 问题1:如何判断网络是否可用?
解答:
可以通过`ConnectivityManager`检测网络状态:
```java
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
补充:建议在发起请求前检查网络状态,并在onFailure
回调中处理无网络情况。
问题2:如何处理大文件上传?
解答:
分片上传:将文件分割为多个小块(如1MB/片),逐片上传并拼接:
// 计算总片数 int chunkSize = 1024 1024; // 1MB int totalChunks = (int) Math.ceil((double) file.length() / chunkSize); // 上传单片 byte[] buffer = new byte[chunkSize]; FileInputStream fis = new FileInputStream(file); for (int i = 0; i < totalChunks; i++) { int readSize = fis.read(buffer); // 构建带分片信息的请求 Request request = new Request.Builder() .url("https://api.example.com/upload?chunk=" + i) .post(RequestBody.create(buffer, 0, readSize, MediaType.parse("application/octet-stream"))) .build(); client.newCall(request).enqueue(callback); }
进度监听:通过
OkHttp
的ProgressResponseBody
实现上传进度监听。断点续传:记录已上传分片索引,重新上传时跳过已完成部分。
扩展知识表
技术点 | 作用 | 推荐库 |
---|---|---|
缓存策略 | 减少重复网络请求 | OkHttpCache(磁盘缓存) Room(本地数据库缓存) |
动态权限 | Android 6.0+运行时权限管理 | PermissionDispatcher 库 |
网络状态监听 | 实时监控网络变化 | NetworkCallback 注册网络状态广播 |