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
相关产品推荐
相关产品推荐

