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

安卓中两种网络通信

安卓网络通信含HTTP(请求响应,如OkHttp)与Socket(TCP/IP长连接,双向传输,如实时通信

HttpURLConnection

特点

  • Android原生支持,无需引入第三方库。
  • 基于Java标准库,可直接调用。
  • 支持HTTP/HTTPS协议,需手动处理线程切换。

使用方法

  1. 创建URL对象并打开连接:
    URL url = new URL("https://api.example.com/data");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  2. 设置请求方法(GET/POST)和超时时间:
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(5000); // 5秒超时
  3. 处理响应:
    int responseCode = connection.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK) {
        InputStream inputStream = connection.getInputStream();
        // 读取数据并解析
    }
  4. 关闭连接:
    connection.disconnect();

优点

安卓中两种网络通信

  • 无第三方依赖,兼容性好。
  • 轻量级,适合简单请求。

缺点

  • 需手动管理线程(需配合AsyncTaskThread)。
  • 功能单一,缺乏缓存、拦截器等高级特性。

OkHttp

特点

  • 第三方开源库(需添加依赖),性能优于原生方案。
  • 支持同步/异步请求、缓存、拦截器、自动重试等。
  • 线程安全,默认支持多线程并发。

使用方法

安卓中两种网络通信

  1. 添加依赖(build.gradle):
    implementation 'com.squareup.okhttp3:okhttp:4.11.0'
  2. 创建OkHttpClient实例:
    OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(5, TimeUnit.SECONDS)
        .build();
  3. 构建请求并发送:
    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 data = response.body().string();
                // 解析数据
            }
        }
    });

优点

  • 高性能,支持连接复用。
  • 丰富的功能(拦截器、缓存、流式上传下载)。
  • 天然支持异步回调,简化线程管理。

缺点

  • 需引入第三方库,增加包体积。
  • 学习成本略高(需理解拦截器、回调机制)。

对比表格

特性 HttpURLConnection OkHttp
性能 较低(每次新建连接) 高(连接复用)
线程管理 需手动处理 内置异步支持
功能扩展 拦截器、缓存、自动重试
代码复杂度 较高(需处理细节) 较低(封装完善)
适用场景 简单请求、兼容旧项目 复杂场景、高性能需求

相关问题与解答

问题1:如何选择HttpURLConnection和OkHttp?
解答

安卓中两种网络通信

  • 若项目简单、依赖少,优先用HttpURLConnection
  • 若需高性能、复杂功能(如缓存、拦截日志),或频繁网络请求,选择OkHttp

问题2:OkHttp的拦截器有什么作用?
解答
拦截器可修改请求/响应(如添加Header、日志记录、重试机制)。

client.interceptors().add(chain -> {
    Request newRequest = chain.request().newBuilder()
        .addHeader("Custom-Header", "Value")
        .build();
    return chain.proceed(newRequest);
});