如何在Inteceptor中处理繁重的计算?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Inteceptor中处理繁重的计算?相关的知识,希望对你有一定的参考价值。
[尝试使用Interceptor从服务器解密JSON(来自dio)。但是UI在解密过程中冻结。
class DecryptInterceptor extends Interceptor {
@override
Future onResponse(Response response) async {
response.data = decrypt(response.data); //freezes here
return super.onResponse(response);
}
}
Object decrypt(Object object){
// computations
}
您可以使用flutter提供的compute
属性来在另一个隔离中执行任务。它确实存在于此类任务。
class DecryptInterceptor extends Interceptor {
@override
Future onResponse(Response response) async {
response.data =await compute(decrypt,response.data); //freezes here
return super.onResponse(response);
}
}
Object decrypt(Object object){
return result;
}
尽管对于可以传递参数并作为结果检索的数据类型有一些限制。您可以了解更多here。
异步编程范例基于单线程模型。异步通过不等待I / O任务完成来优化CPU使用率。而是,它对任务进行回调,并告诉它“完成时调用此任务”。现在,它可以在任务完成并调用回调时处理其他工作。当任务是HTTP请求或文件操作时,这很有意义,因为它们将由其他设备(而不是CPU)处理。但是,如果该任务占用大量CPU,则使用异步将无济于事。
您可以查看Isolate,相当于Dart中的线程。您可以创建一个单独的隔离并在其中运行繁重的任务。
还有compute()
方法。它需要一个函数和一个参数,然后使用提供的参数在单独的隔离上对该函数求值,并将结果返回为compute()
。这要容易得多,并且可以完成工作。
一种CPU密集型虚拟方法:
Future
使用int heavyTask(int n) {
int z = n;
for (var i = 0; i < n; i++) {
i % 2 == 0 ? z-- : z += 3;
}
return z + n;
}
方法在单独的隔离上运行它:
compute()
以上是关于如何在Inteceptor中处理繁重的计算?的主要内容,如果未能解决你的问题,请参考以下文章
运行队列如何在 Snowflake 中工作?是不是有概念时间片?
如何实现令牌系统以限制 C# 中处理器/IO 繁重的多线程任务的并发性?