MST

星途 面试题库

面试题:Flutter网络请求并发场景下如何处理错误与资源释放

在使用Flutter进行多个网络请求并发时,可能会出现部分请求失败的情况。请阐述如何优雅地处理这些错误,并且保证在请求完成或出错时及时释放相关资源(如取消未完成的请求),同时给出对应的代码示例。
47.9万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Future.wait结合try-catch处理错误并释放资源
    • Future.wait可以并发执行多个Future,通过在try-catch块中捕获异常,来处理请求失败的情况。
    • 对于释放资源(取消未完成的请求),可以使用CancelToken(在http库中)。
  2. 代码示例: 假设我们使用http库进行网络请求。首先添加依赖:
    dependencies:
      http: ^0.13.5
    
    然后编写如下代码:
    import 'dart:async';
    import 'package:http/http.dart' as http;
    
    Future<void> main() async {
      List<Future<http.Response>> requests = [
        makeRequest('https://example.com/api1'),
        makeRequest('https://example.com/api2'),
        makeRequest('https://example.com/api3')
      ];
    
      try {
        List<http.Response> responses = await Future.wait(requests);
        for (var response in responses) {
          print('Response status: ${response.statusCode}');
          print('Response body: ${response.body}');
        }
      } catch (e) {
        print('An error occurred: $e');
      }
    }
    
    Future<http.Response> makeRequest(String url) async {
      var cancelToken = http.CancelToken();
      Timer(Duration(seconds: 5), () => cancelToken.cancel());// 5秒后取消请求
      try {
        return await http.get(Uri.parse(url), cancelToken: cancelToken);
      } on http.RequestCanceledException catch (e) {
        print('Request canceled: $e');
        rethrow;
      }
    }
    

在上述代码中:

  • Future.wait用于并发执行多个网络请求。
  • try-catch块捕获请求过程中的异常。
  • makeRequest方法中,使用CancelToken来模拟超时取消请求,并且在捕获到RequestCanceledException时重新抛出异常,以便外层try-catch统一处理。这样既优雅地处理了错误,又能及时释放相关资源(取消未完成的请求)。