面试题答案
一键面试1. 结合 async/await
- 异步处理:Flutter 中使用
async/await
可以方便地将异步操作以同步的方式书写,使代码逻辑更清晰。对于网络请求,无论是 WebSocket 还是 HTTP 请求,都应使用异步函数封装。例如,对于 HTTP 请求:
Future<http.Response> fetchData() async {
final response = await http.get(Uri.parse('https://example.com/api/data'));
return response;
}
- 并发与顺序处理:对于多个网络请求,如果它们之间没有依赖关系,可以使用
Future.wait
实现并发请求,以提高效率。
Future<void> fetchMultipleData() async {
List<Future<http.Response>> requests = [
http.get(Uri.parse('https://example.com/api/data1')),
http.get(Uri.parse('https://example.com/api/data2'))
];
List<http.Response> responses = await Future.wait(requests);
// 处理 responses
}
而如果请求之间有依赖关系,则按顺序使用 await
依次处理。
2. 定制或优化现有网络请求插件
- HTTP 插件优化:
- 连接池:对于频繁的短连接 HTTP 请求,使用连接池可以减少每次建立新连接的开销。在 Dart 中,
http
包默认已经对连接进行了一定程度的复用,但对于高并发场景,可以考虑定制连接池,例如增加连接池的最大连接数。 - 请求队列:当网络状况不佳时,如 2G、3G 网络,可能会出现大量请求同时失败的情况。可以实现一个请求队列,将失败的请求按照一定的策略(如指数退避)重新加入队列进行重试。
- 压缩:启用 HTTP 压缩,在请求头中设置
Accept-Encoding: gzip
,服务器端相应进行数据压缩,减少传输数据量,提高传输速度。
- 连接池:对于频繁的短连接 HTTP 请求,使用连接池可以减少每次建立新连接的开销。在 Dart 中,
- WebSocket 优化:
- 心跳机制:为保持长连接的稳定性,实现心跳机制。定期向服务器发送心跳包,防止服务器端关闭连接。可以在 Dart 中使用
Timer.periodic
定时发送心跳消息。 - 优化消息格式:尽量精简 WebSocket 传输的消息格式,减少不必要的字段,降低数据传输量。
- 心跳机制:为保持长连接的稳定性,实现心跳机制。定期向服务器发送心跳包,防止服务器端关闭连接。可以在 Dart 中使用
3. 设计缓存策略
- 内存缓存:使用
InMemoryCache
类,在内存中缓存最近使用的数据。例如,对于一些频繁请求且不经常变化的数据,可以将其缓存在内存中。当请求到来时,先检查内存缓存中是否存在数据,如果存在则直接返回,避免不必要的网络请求。
class InMemoryCache {
static Map<String, dynamic> cache = {};
static dynamic get(String key) => cache[key];
static void put(String key, dynamic value) => cache[key] = value;
}
- 磁盘缓存:对于一些较大的数据或者需要长期保存的数据,可以使用磁盘缓存。Flutter 中可以使用
shared_preferences
等插件存储简单数据,对于复杂数据可以考虑使用sqflite
数据库进行存储。当网络请求时,先检查磁盘缓存中是否有相应数据,如果有且数据未过期,则直接使用,否则发起网络请求,并在请求成功后更新磁盘缓存。 - 缓存过期策略:为缓存数据设置过期时间。例如,对于实时性要求较高的数据,设置较短的过期时间;对于相对静态的数据,设置较长的过期时间。在获取缓存数据时,检查数据是否过期,过期则重新请求。
class CachedData {
dynamic data;
DateTime expiration;
CachedData(this.data, this.expiration);
bool isExpired() => DateTime.now().isAfter(expiration);
}