You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter弱网络检测:如何识别项目中的慢速网络连接?

检测弱网络连接的实用方案

以下是几种落地性强的弱网络检测方法,可根据你的项目平台(移动端/前端/后端)选择适配:

1. 主动测速法(通用)

发起小文件的HTTP/HTTPS请求,计算下载速度来判断网络质量,这是最直接的方式:

  • 准备一个10-100KB的静态资源(比如txt、小图标)放在你的服务器上,避免跨域和第三方资源波动影响结果
  • 记录请求开始时间和结束时间,结合文件大小计算实际吞吐量
  • 设定阈值(比如低于100kbps标记为弱网,可根据业务调整:视频类APP阈值可设为500kbps,文字类可低至50kbps)

示例代码(Android + OkHttp):

long startTime = System.currentTimeMillis();
Request request = new Request.Builder()
    .url("https://your-domain.com/test-10k.txt") // 替换为你的测试资源
    .build();
new OkHttpClient().newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 请求失败可视为网络异常
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        long endTime = System.currentTimeMillis();
        long fileSize = response.body().contentLength();
        // 计算速度:(字节数*8) / 时间秒数 = 比特数,再转kbps
        double speedKbps = (fileSize * 8) / ((endTime - startTime) / 1000.0) / 1024;
        boolean isWeakNetwork = speedKbps < 100; // 自定义阈值
    }
});

2. 监控日常请求的延迟与成功率

基于项目中已有的API请求数据做分析,更贴合实际业务场景:

  • 统计每个请求的RTT(往返时间),计算最近N个请求的平均延迟
  • 监控请求失败率(比如超时、5xx错误)
  • 触发条件:连续5个请求平均RTT超过800ms,或失败率超过30%,判定为弱网

3. 利用系统API获取网络硬件参数(移动端专属)

通过系统提供的API直接读取网络信号强度、网络类型等硬件指标:

Android 示例:

// 检测WiFi信号强度
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    int rssi = wifiManager.getConnectionInfo().getRssi();
    // 通常RSSI < -70dBm 视为弱WiFi信号
    boolean isWeakWifi = rssi < -70;
}

// 检测移动网络类型与信号
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
int networkType = tm.getNetworkType();
// 2G网络直接标记为弱网,3G/4G可结合信号强度判断
boolean isWeakMobile = networkType == TelephonyManager.NETWORK_TYPE_GPRS 
        || networkType == TelephonyManager.NETWORK_TYPE_EDGE;

iOS 示例:

// 获取WiFi信号强度
NSDictionary *wifiInfo = (__bridge NSDictionary *)CNCopyCurrentNetworkInfo(kCNNetworkInfoKeyWiFi);
NSNumber *rssi = wifiInfo[kCNNetworkInfoKeyRSSI];
BOOL isWeakWifi = [rssi intValue] < -70;

// 获取移动网络类型
CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
NSString *carrierType = networkInfo.currentRadioAccessTechnology;
BOOL isWeakMobile = [carrierType isEqualToString:CTRadioAccessTechnologyGPRS] 
        || [carrierType isEqualToString:CTRadioAccessTechnologyEdge];

4. TCP连接/ICMP Ping探测

通过底层网络协议判断连通性和延迟:

  • TCP握手检测:尝试与服务器建立TCP连接,统计握手耗时,超过200ms视为弱网
  • Ping探测:执行ping -c 4 your-server.com(注意移动端需要权限),统计平均延迟,超过100ms标记弱网;但需注意部分网络会屏蔽ICMP包,导致结果不准确

注意事项

  • 避免频繁测速:比如每分钟最多1次,或在用户触发操作(如刷新、加载)前按需检测,减少流量消耗
  • 多维度综合判断:结合系统信号、测速结果、请求成功率,降低误判概率
  • 动态调整阈值:根据用户所在地区、网络类型(WiFi/移动)设置不同的判断标准

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:15:29