MST

星途 面试题库

面试题:Flutter跨平台网络请求优化之iOS与Android差异处理

在Flutter项目中,针对iOS和Android不同的网络环境和性能特点,如何优化网络请求的性能?请分别从缓存策略、请求并发控制方面举例说明。
27.7万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

缓存策略

  • iOS
    • 利用NSURLCache,它提供了对HTTP和HTTPS请求的响应进行缓存的功能。例如,可以设置如下代码来配置缓存:
let cache = NSURLCache(memoryCapacity: 10 * 1024 * 1024, diskCapacity: 50 * 1024 * 1024, diskPath: "myCache")
NSURLCache.setSharedURLCache(cache)

在Flutter中使用http库时,可配合io库中与iOS原生交互的方式来间接使用上述缓存机制。 - 对于图片请求,iOS原生的SDWebImage库有很好的缓存策略,在Flutter的flutter_image等相关插件中,有些会底层调用iOS原生的图片缓存逻辑,以优化图片网络请求。

  • Android
    • 使用OkHttp的缓存功能,OkHttp默认支持HTTP缓存。可以通过如下代码配置:
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(httpCacheDirectory, cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
      .cache(cache)
      .build();

在Flutter项目中,如果使用http库,其底层也是基于OkHttp,可直接受益于上述缓存配置。 - 对于Glide图片加载框架,在Android平台广泛使用,它有强大的图片缓存策略,在Flutter的flutter_image相关插件中,有些会利用Glide来实现图片加载与缓存优化。

请求并发控制

  • iOS
    • 使用NSOperationQueue来控制并发请求数量。例如,创建一个最大并发数为3的队列:
let operationQueue = NSOperationQueue()
operationQueue.maxConcurrentOperationCount = 3
let request1 = NSURLRequest(url: URL(string: "url1")!)
let request2 = NSURLRequest(url: URL(string: "url2")!)
let request3 = NSURLRequest(url: URL(string: "url3")!)
let dataTask1 = URLSession.shared.dataTask(with: request1)
let dataTask2 = URLSession.shared.dataTask(with: request2)
let dataTask3 = URLSession.shared.dataTask(with: request3)
operationQueue.addOperation(dataTask1)
operationQueue.addOperation(dataTask2)
operationQueue.addOperation(dataTask3)

在Flutter中,可以通过platform_channel来与iOS原生代码交互,从而实现类似的并发控制。

  • Android
    • 使用OkHttp的Dispatcher来控制并发请求。例如,设置最大并发请求数为2:
OkHttpClient client = new OkHttpClient.Builder()
      .dispatcher(new Dispatcher().setMaxRequests(2))
      .build();

在Flutter项目中,由于http库底层基于OkHttp,在合适的场景下可以通过自定义HttpClient来实现对并发请求的控制。