如何在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 中工作?是不是有概念时间片?

java web拦截器inteceptor

如何实现令牌系统以限制 C# 中处理器/IO 繁重的多线程任务的并发性?

使用 ajax 轮询缓解繁重的 django 石墨烯请求

如何将 QProcess 的执行与 QProgressBar 的推进联系起来以实现非常繁重的计算循环

我应该如何使用 JavaScript/HTML5 处理繁重的音频负载?