MST

星途 面试题库

面试题:Flutter网络请求速度提升的策略与实践

假设你正在开发一个Flutter应用,需要频繁向服务器请求大量数据。请阐述如何从缓存策略、请求队列管理以及HTTP/3协议使用等方面提升网络请求速度,并给出相关代码示例。
29.8万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

缓存策略

  1. 内存缓存:在应用内存中存储近期请求的数据,下次请求相同数据时先从内存中查找。可以使用Map来简单实现。
    Map<String, dynamic> memoryCache = {};
    Future<dynamic> getDataFromMemoryCache(String url) async {
      if (memoryCache.containsKey(url)) {
        return memoryCache[url];
      }
      return null;
    }
    Future<dynamic> setDataToMemoryCache(String url, dynamic data) async {
      memoryCache[url] = data;
      return data;
    }
    
  2. 磁盘缓存:使用shared_preferences等插件将数据持久化到磁盘。这样即使应用关闭再打开,仍可使用缓存数据。
    import 'package:shared_preferences/shared_preferences.dart';
    
    Future<dynamic> getDataFromDiskCache(String key) async {
      final prefs = await SharedPreferences.getInstance();
      return prefs.get(key);
    }
    
    Future<bool> setDataToDiskCache(String key, dynamic value) async {
      final prefs = await SharedPreferences.getInstance();
      if (value is String) {
        return prefs.setString(key, value);
      } else if (value is int) {
        return prefs.setInt(key, value);
      } else if (value is double) {
        return prefs.setDouble(key, value);
      } else if (value is bool) {
        return prefs.setBool(key, value);
      } else if (value is List<String>) {
        return prefs.setStringList(key, value);
      }
      return false;
    }
    

请求队列管理

  1. 使用Queue:可以使用dart:collection中的Queue来管理请求。当有新请求时,将其加入队列,依次处理。
    import 'dart:collection';
    Queue<Future> requestQueue = Queue();
    
    void addRequestToQueue(Future request) {
      requestQueue.add(request);
    }
    
    Future processQueue() async {
      while (requestQueue.isNotEmpty) {
        await requestQueue.removeFirst();
      }
    }
    
  2. 限制并发请求数:防止过多请求导致网络拥塞。可以使用StreamControllerStream来实现。
    import 'dart:async';
    
    int maxConcurrentRequests = 3;
    StreamController _streamController = StreamController();
    Stream get requestStream => _streamController.stream;
    
    void addRequest(Future request) {
      requestStream.listen((_) async {
        await request;
        _streamController.add(null);
      });
      _streamController.add(null);
    }
    
    void startRequestStream() {
      for (int i = 0; i < maxConcurrentRequests; i++) {
        _streamController.add(null);
      }
    }
    

HTTP/3协议使用

在Flutter中,使用http库时,若底层网络支持HTTP/3(如在支持的操作系统和网络环境下),http库会自动使用合适的协议版本。

  1. 简单HTTP GET请求示例
    import 'package:http/http.dart' as http;
    
    Future<http.Response> fetchData() async {
      final response = await http.get(Uri.parse('https://example.com/api/data'));
      if (response.statusCode == 200) {
        return response;
      } else {
        throw Exception('Failed to load data');
      }
    }
    
    这里如果网络环境支持HTTP/3,http.get方法会优先使用HTTP/3协议进行请求,从而提升网络请求速度。同时结合上述缓存策略和请求队列管理,能进一步优化整体的网络请求性能。