面试题答案
一键面试避免过多重试导致资源浪费
- 设置重试次数限制 在发起网络请求时,设定一个合理的最大重试次数。例如:
const maxRetries = 3;
这样可以避免无限重试,防止占用过多资源。 2. 指数退避策略 随着重试次数增加,延长重试间隔时间。可以使用指数退避算法,每次重试间隔时间翻倍。
Duration getRetryInterval(int retryCount) {
return Duration(seconds: 2 << retryCount);
}
这能减少短时间内大量重复请求对网络和服务器的压力。
优化重试队列提高整体效率
- 优先级队列
对于不同类型的网络请求,设置不同优先级。比如,涉及用户关键操作(如支付)的请求优先级高,页面数据获取的优先级相对低。使用
PriorityQueue
来管理重试队列。
import 'dart:collection';
final PriorityQueue<NetworkRequest> retryQueue = PriorityQueue<NetworkRequest>(
(a, b) => a.priority.compareTo(b.priority),
);
- 批量处理重试 当网络状况恢复时,不要立即逐个处理重试队列中的请求,而是按照一定数量进行批量处理。例如每次处理5个请求。
void batchRetry() {
const batchSize = 5;
for (var i = 0; i < batchSize && retryQueue.isNotEmpty; i++) {
final request = retryQueue.removeFirst();
// 发起重试请求
}
}
技术要点
- 状态管理
使用
StatefulWidget
或状态管理库(如Provider、Bloc)来管理网络请求的状态,包括初始、加载中、成功、失败等,以便在界面上准确反馈给用户。 - 错误处理 在网络请求失败时,准确判断失败原因。例如,404错误可能不需要重试,而网络连接错误则可以重试。
void handleNetworkError(NetworkError error, NetworkRequest request) {
if (error is ConnectivityError) {
// 加入重试队列
retryQueue.add(request);
} else if (error is HttpError && error.statusCode == 404) {
// 不重试,显示相应提示
}
}
- 网络监听
利用Flutter的网络监听插件(如
connectivity_plus
),实时监测网络状态。当网络恢复时,触发重试操作。
import 'package:connectivity_plus/connectivity_plus.dart';
final connectivitySubscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) {
if (result != ConnectivityResult.none) {
batchRetry();
}
});