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