You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android模拟器中Retrofit/OkHttp初始网络请求延迟问题求助

解决Android模拟器上OkHttp首次请求长时间延迟的问题

根据你描述的现象——仅Android模拟器出现首次请求30-40秒延迟、物理设备正常、线程dump卡在TCP连接阶段,以下是几个经过验证的解决思路:

1. 更换模拟器的DNS服务器

模拟器默认的DNS解析经常会出现超时问题,尤其是首次连接时。你可以手动设置公共DNS来规避:

  • 打开模拟器的「设置」→「网络和互联网」→「Wi-Fi」
  • 长按当前连接的Wi-Fi网络,选择「修改网络」
  • 勾选「显示高级选项」,将IP设置改为「静态」
  • 在DNS1栏填入8.8.8.8,DNS2填入8.8.8.4(或者1.1.1.1这类可靠公共DNS)

2. 强制OkHttp优先使用IPv4

模拟器的网络栈对IPv6的支持往往不稳定,导致OkHttp在尝试IPv6连接超时后才会 fallback到IPv4,这会浪费大量时间。你可以通过自定义DNS解析逻辑,让OkHttp只返回IPv4地址:

OkHttpClient client = new OkHttpClient.Builder()
    .dns(hostname -> {
        List<InetAddress> allAddresses = InetAddress.getAllByName(hostname);
        List<InetAddress> ipv4Addresses = new ArrayList<>();
        for (InetAddress addr : allAddresses) {
            if (addr instanceof Inet4Address) {
                ipv4Addresses.add(addr);
            }
        }
        // 如果没有IPv4地址, fallback到原解析结果
        return ipv4Addresses.isEmpty() ? allAddresses : ipv4Addresses;
    })
    .build();

3. 清除模拟器的代理配置

有时候模拟器会自动残留错误的代理设置,导致网络连接受阻:

  • 进入模拟器「设置」→「网络和互联网」→「代理」
  • 确保代理模式设置为「无」,没有任何代理地址和端口被填写

4. 更新Android模拟器到最新版本

旧版本的模拟器网络栈存在不少已知bug,更新到最新的Android Studio和模拟器系统镜像,很多这类网络延迟问题都会被官方修复。

问题根源分析

从你的线程dump可以看到,请求卡在了java.net.PlainSocketImpl.socketConnect步骤,这说明延迟发生在TCP连接建立阶段,而非OkHttp/Retrofit的逻辑层。结合仅模拟器出现问题的情况,本质是模拟器的虚拟网络环境在首次域名解析或连接时的超时问题——比如DNS解析缓慢、IPv6连接失败后的超时等待、虚拟网络配置异常等。

另外你提到的Advanced Profiling,其实和这类网络延迟关联极小,无需纠结是否能禁用它。

内容的提问来源于stack exchange,提问作者yoyo

火山引擎 最新活动