flutter - 如何避免在繁重的计算中卡住 UI

标签 flutter dart dio

尝试使用拦截器从服务器解密 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
}

最佳答案

异步编程范式基于单线程模型。异步通过不等待 I/O 任务完成来优化 CPU 使用率。相反,它对任务进行回调并告诉它“完成后调用它”。现在它可以在任务完成并调用回调时处理其他工作。当任务是 HTTP 请求或文件操作时,这是有道理的,因为这些将由其他设备而不是 CPU 处理。但如果任务是 CPU 密集型任务,那么使用异步将无济于事。

你可以看看Isolate ,相当于 Dart 中的线程。您可以创建一个单独的隔离区并在那里运行繁重的任务。

还有compute()方法。它接受一个函数和参数,然后在单独的隔离中使用提供的参数评估该函数,并将结果作为 Future 返回。这更容易并且可以完成工作。

一个 CPU 密集型的虚拟方法:

int heavyTask(int n) {
  int z = n;
  for (var i = 0; i < n; i++) {
    i % 2 == 0 ? z-- : z += 3;
  }
  return z + n;
}

使用 compute() 方法在单独的隔离上运行它:

 compute(heavyTask, 455553000)
     .then((res) => print("result is $res"));

关于flutter - 如何避免在繁重的计算中卡住 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045874/

相关文章:

api - 如何设置一个基本 URL 以及在哪里为 api 调用在 flutter dio 中声明它?

flutter - Dart 中的批处理 future

flutter - 为什么要在 Dart 类里面使用 Prop ?

dart - 基于列表创建小部件

dart - 如何在Polymer Dart中进行自定义验证

http - DioError [DioErrorType.RESPONSE] : Http status error [405] [Solved]

ios - 有没有办法在 flutter 中从 iOS 中排除一个包?

android - Flutter:将图标放置在居中的 CircleAvatar 旁边

dart - 使用 Redstone/Shelf 在 Dart 中流式传输文本

Flutter Dart Dio Get Request 太慢了