上一篇
安卓中接收服务器数据
- 行业动态
- 2025-04-24
- 4
安卓接收服务器数据需通过HttpURLConnection或OkHttp发起网络请求,异步处理响应数据,解析JSON/XML后更新UI,需声明INTERNET
安卓接收服务器数据详解
核心实现方式
安卓接收服务器数据主要通过以下三种方式:
方式 | 适用场景 | 核心类/库 |
---|---|---|
HTTP/HTTPS请求 | 一次性数据获取(如API接口) | HttpURLConnection 、OkHttp 、Retrofit |
WebSocket | 实时双向通信(如聊天、推送) | OkHttp WebSocket、Socket.IO |
TCP Socket | 长连接数据传输(如文件传输) | Socket 类 |
HTTP请求实现步骤
添加网络权限
在AndroidManifest.xml
中声明权限:<uses-permission android:name="android.permission.INTERNET" />
使用 OkHttp 发送请求(推荐)
// 依赖:implementation 'com.squareup.okhttp3:okhttp:4.9.3' 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 jsonData = response.body().string(); // 解析 JSON 数据(如用 Gson) } } });
异步处理(避免阻塞主线程)
- 使用
enqueue
方法(OkHttp)。 - 或结合
AsyncTask
、RxJava
、Kotlin Coroutines
处理。
- 使用
WebSocket 实时通信
依赖与初始化
// 依赖:implementation 'com.squareup.okhttp3:okhttp:4.9.3' OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("wss://echo.websocket.org").build(); WebSocketListener listener = new WebSocketListener() { @Override public void onMessage(WebSocket webSocket, String text) { // 处理服务器推送的消息 } }; WebSocket ws = client.newWebSocket(request, listener);
发送与接收数据
- 调用
ws.send(String)
发送消息。 - 重写
onMessage
方法接收服务器消息。
- 调用
关键注意事项
问题 | 解决方案 |
---|---|
主线程网络操作 | 使用子线程或异步框架(如 enqueue 、Coroutine )。 |
HTTPS 证书验证 | 自定义 TrustManager 或使用 HttpsURLConnection 的 setDefaultHostnameVerifier 。 |
大文件下载 | 使用 InputStream 分块读取,避免内存溢出。 |
JSON 解析 | 推荐 Gson (com.google.gson:gson:2.8.6 )或 Moshi 。 |
完整示例(OkHttp + Gson)
// 1. 添加依赖 // implementation 'com.squareup.okhttp3:okhttp:4.9.3' // implementation 'com.google.gson:gson:2.8.6' // 2. 定义数据模型(假设返回字段为 {"name": "John", "age": 30}) public class User { String name; int age; } // 3. 发送请求并解析 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("https://api.example.com/user").build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理错误(如Toast提示) } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String json = response.body().string(); User user = new Gson().fromJson(json, User.class); // 自动映射到对象 // 更新UI需切换到主线程 } } });
相关问题与解答
问题1:如何解析复杂的 JSON 数据?
解答:
- 使用
Gson
的serializedName
注解处理字段名不一致问题。 - 对于嵌套数据,直接定义嵌套类。
public class ResponseData { String status; UserData data; // 嵌套类 } public class UserData { String name; int age; }
- 或使用
TypeToken
解析泛型数据:List<User> users = new Gson().fromJson(json, new TypeToken<List<User>>(){}.getType());
问题2:如何实现文件下载并显示进度?
解答:
- 使用 OkHttp 分块读取:
Request request = new Request.Builder().url(fileUrl).build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { InputStream is = response.body().byteStream(); FileOutputStream fos = new FileOutputStream(targetFile); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); // 计算进度:(已写入字节 / 总字节) 100 } fos.close(); } });
- 更新 UI 进度:
- 通过
Handler
或LiveData
将进度传回主线程。 - 结合
ProgressBar
显示下载
- 通过