当前位置:首页 > 行业动态 > 正文

安卓中接收服务器数据

安卓接收服务器数据需通过HttpURLConnection或OkHttp发起网络请求,异步处理响应数据,解析JSON/XML后更新UI,需声明INTERNET

安卓接收服务器数据详解


核心实现方式

安卓接收服务器数据主要通过以下三种方式:

方式 适用场景 核心类/库
HTTP/HTTPS请求 一次性数据获取(如API接口) HttpURLConnectionOkHttpRetrofit
WebSocket 实时双向通信(如聊天、推送) OkHttp WebSocket、Socket.IO
TCP Socket 长连接数据传输(如文件传输) Socket

HTTP请求实现步骤

  1. 添加网络权限
    AndroidManifest.xml 中声明权限:

    <uses-permission android:name="android.permission.INTERNET" />
  2. 使用 OkHttp 发送请求(推荐)

    安卓中接收服务器数据  第1张

    // 依赖: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)
            }
        }
    });
  3. 异步处理(避免阻塞主线程)

    • 使用 enqueue 方法(OkHttp)。
    • 或结合 AsyncTaskRxJavaKotlin Coroutines 处理。

WebSocket 实时通信

  1. 依赖与初始化

    // 依赖: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);
  2. 发送与接收数据

    • 调用 ws.send(String) 发送消息。
    • 重写 onMessage 方法接收服务器消息。

关键注意事项

问题 解决方案
主线程网络操作 使用子线程或异步框架(如 enqueueCoroutine)。
HTTPS 证书验证 自定义 TrustManager 或使用 HttpsURLConnectionsetDefaultHostnameVerifier
大文件下载 使用 InputStream 分块读取,避免内存溢出。
JSON 解析 推荐 Gsoncom.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 数据?

解答

  • 使用 GsonserializedName 注解处理字段名不一致问题。
  • 对于嵌套数据,直接定义嵌套类。
    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:如何实现文件下载并显示进度?

解答

  1. 使用 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();
        }
    });
  2. 更新 UI 进度
    • 通过 HandlerLiveData 将进度传回主线程。
    • 结合 ProgressBar 显示下载
0