flutter开发实战-compute将工作交由isolate处理
最近查看flutter文档时候,看到了compute可以将工作交由isolate处理。通过 Flutter 提供的 compute() 方法将解析和转换的工作移交到一个后台 isolate 中。这个 compute() 函数可以在后台 isolate 中运行复杂的函数并返回结果。
一、compute使用
compute
/// The dart:io implementation of [isolate.compute].
Future<R> compute<Q, R>(isolates.ComputeCallback<Q, R> callback, Q message, {String? debugLabel}) async {debugLabel ??= kReleaseMode ? 'compute' : callback.toString();return Isolate.run<R>(() {return callback(message);}, debugName: debugLabel);
}
例如有一下代码
Future<bool> isPrime(int value) {return compute(_calculate, value);}bool _calculate(int value) {if (value == 1) {return false;}for (int i = 2; i < value; ++i) {if (value % i == 0) {return false;}}return true;}
compute() 函数可以在后台 isolate 中运行复杂的函数并返回结果。
二、compute处理网络数据解析
获取网络图片代码
// 创建一个可以将响应体转换成 List<Photo> 的方法:parsePhotos()
// A function that converts a response body into a List<Photo>.
List<Photo> parsePhotos(String responseBody) {final parsed =(jsonDecode(responseBody) as List).cast<Map<String, dynamic>>();return parsed.map<Photo>((json) => Photo.fromJson(json)).toList();
}// 在 fetchPhotos() 方法中使用 parsePhotos() 方法
Future<List<Photo>> fetchPhotos(http.Client client) async {final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/photos'));// Synchronously run parsePhotos in the main isolate.return parsePhotos(response.body);
}
如果在很慢的手机上运行fetchPhotos方法,或许会注意到应用会有点卡顿,因为它需要解析并转换 json。显然这并不好,所以你要避免它。我们需要用到compute
使用compute将工作交由isolate处理的代码如下
Future<List<Photo>> fetchPhotos(http.Client client) async {final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/photos'));// Use the compute function to run parsePhotos in a separate isolate.return compute(parsePhotos, response.body);
}
三、小结
flutter开发实战-compute将工作交由isolate处理
学习记录,每天不停进步。
https://docs.flutter.cn/cookbook/networking/background-parsing