面试题答案
一键面试iOS 平台网络请求优化
- 连接池管理:
- 在 iOS 中,
NSURLSession
会自动管理连接池。默认情况下,它会根据应用的需求创建和复用连接。不过,可以通过设置NSURLSessionConfiguration
的HTTPMaximumConnectionsPerHost
属性来控制每个主机的最大连接数。例如:
适当调整这个值可以避免过多连接导致的资源浪费,同时保证请求的并发处理能力。let configuration = URLSessionConfiguration.default configuration.httpMaximumConnectionsPerHost = 5 let session = URLSession(configuration: configuration)
- 在 iOS 中,
- 请求超时设置:
- 可以通过
NSURLSessionTask
的timeoutIntervalForRequest
和timeoutIntervalForResource
属性来设置请求超时。timeoutIntervalForRequest
是等待服务器响应的超时时间,timeoutIntervalForResource
是获取整个资源的超时时间。例如:
合理设置这些超时时间,既可以避免长时间等待无响应的请求,又能确保复杂资源下载有足够时间。let task = session.dataTask(with: url) { data, response, error in // 处理响应 } task.timeoutIntervalForRequest = 15 task.timeoutIntervalForResource = 60 task.resume()
- 可以通过
- 网络状态监测:
- 使用
Reachability
库来监测网络状态。可以检测网络是否可用,以及是 WiFi 还是蜂窝网络。例如:
根据网络状态调整网络请求策略,如在蜂窝网络下减少大数据量请求等。let reachability = try? Reachability() reachability?.whenReachable = { reachability in if reachability.connection ==.wifi { // 处理 WiFi 网络连接情况 } else if reachability.connection ==.cellular { // 处理蜂窝网络连接情况 } } reachability?.whenUnreachable = { _ in // 处理网络不可用情况 } try? reachability?.startNotifier()
- 使用
- HTTP/2 支持:
- iOS 从 iOS 9 开始支持 HTTP/2。确保服务器端也支持 HTTP/2,这样可以利用 HTTP/2 的多路复用、头部压缩等特性提升性能。无需额外配置,
NSURLSession
会自动协商使用 HTTP/2。
- iOS 从 iOS 9 开始支持 HTTP/2。确保服务器端也支持 HTTP/2,这样可以利用 HTTP/2 的多路复用、头部压缩等特性提升性能。无需额外配置,
Android 平台网络请求优化
- 连接池管理:
- 在 Android 中,对于 OkHttp 库(常用于网络请求),可以通过
OkHttpClient
来管理连接池。可以设置连接池的最大空闲连接数和连接存活时间。例如:
这里设置了最大 5 个空闲连接,连接存活时间为 5 分钟,合理设置这些参数可以有效复用连接,减少连接建立的开销。ConnectionPool connectionPool = new ConnectionPool(5, 5, TimeUnit.MINUTES); OkHttpClient client = new OkHttpClient.Builder() .connectionPool(connectionPool) .build();
- 在 Android 中,对于 OkHttp 库(常用于网络请求),可以通过
- 请求超时设置:
- 使用 OkHttp 时,可以在
OkHttpClient.Builder
中设置请求超时时间。例如:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .build();
connectTimeout
是连接服务器的超时时间,readTimeout
是读取响应数据的超时时间,writeTimeout
是写入请求数据的超时时间。根据业务需求合理调整这些超时值。 - 使用 OkHttp 时,可以在
- 网络状态监测:
- 可以通过
ConnectivityManager
来监测网络状态。例如:
根据网络状态合理安排网络请求,比如在移动网络下减少不必要的大文件下载。ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { // 处理 WiFi 网络连接情况 } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { // 处理移动网络连接情况 } } else { // 处理网络不可用情况 }
- 可以通过
- HTTP/2 支持:
- Android 从 Android 5.0(API 21)开始支持 HTTP/2。同样,确保服务器端支持 HTTP/2。OkHttp 默认会尝试使用 HTTP/2,无需额外复杂配置,利用其特性提升网络性能。
- Gzip 压缩:
- 在 Android 网络请求中,OkHttp 支持自动解压缩 Gzip 格式的数据。可以在请求头中添加
Accept - Encoding: gzip
,服务器返回 Gzip 压缩数据后,OkHttp 会自动解压缩,减少数据传输量,提升传输速度。例如:
Request request = new Request.Builder() .url(url) .addHeader("Accept - Encoding", "gzip") .build();
- 在 Android 网络请求中,OkHttp 支持自动解压缩 Gzip 格式的数据。可以在请求头中添加
Flutter 项目整合优化
- 跨平台网络库选择:
- 在 Flutter 项目中,可以使用
http
库(基于 Dart 标准库)或者dio
库(功能更丰富)。这些库在底层会根据不同平台使用相应的原生网络实现(iOS 用NSURLSession
,Android 用 OkHttp)。在初始化网络请求客户端时,可以根据平台特性进行相应配置。例如,使用dio
库:
import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; Dio createDio() { Dio dio = Dio(); if (kIsWeb) { // Web 平台相关配置 } else if (defaultTargetPlatform == TargetPlatform.android) { // Android 平台配置,如设置 OkHttp 相关参数 (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (HttpClient client) { client.connectionTimeout = Duration(seconds: 10); client.idleTimeout = Duration(seconds: 15); }; } else if (defaultTargetPlatform == TargetPlatform.iOS) { // iOS 平台配置,如设置 NSURLSession 相关参数(通过底层实现间接配置) dio.options.connectTimeout = 15000; dio.options.receiveTimeout = 60000; } return dio; }
- 在 Flutter 项目中,可以使用
- 统一网络状态监听:
- 可以使用
connectivity_plus
库来统一监听不同平台的网络状态。例如:
通过这种方式,在 Flutter 项目中可以根据不同平台的网络状态统一管理网络请求策略,提升整体网络请求性能。import 'package:connectivity_plus/connectivity_plus.dart'; void main() { Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { if (result == ConnectivityResult.wifi) { // 处理 WiFi 连接情况 } else if (result == ConnectivityResult.mobile) { // 处理移动网络连接情况 } else { // 处理网络断开情况 } }); }
- 可以使用