Dart future 阻塞主线程

2024-04-15

我正在开发一个捕获和处理图像的应用程序。代码的简化版本是:

build() {
   return FloatingActionButton(
        onPressed: processImage,
        child: Icon(
          Icons.camera_alt,
          color: color,
        ),
      ); 
}

processImage(Camera image) async {
   await image.process();   
}

在另一堂课上:

Future<image> process() {
  return Future(() {
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        //process image
      }
    }
  });
}

但当process()运行时,UI 冻结。

为什么会发生这种情况?该函数不是传递给在后台运行的 Future 构造函数吗?


由于 Dart 使用事件循环,因此所有代码(同步和异步)将简单地在同一事件循环上运行isolate (think thread在其他语言中作为类比),只是在不同的时间点。因此,当你的process方法出队并执行,尽管是异步的,但它会阻塞线程并由于执行时间较长而导致丢帧。该问题的最佳解决方案是在新线程中生成另一个隔离,并在那里执行计算。 Flutter 为这个确切的用例提供了一种方便的方法,称为compute https://api.flutter.dev/flutter/foundation/compute.html。它需要一个顶级函数(不在类中,也不是匿名函数),该函数可以具有基本类型参​​数(包括Map and List) 作为一个参数,并将在将来的某个时刻返回。欲了解更多信息compute,请参阅上面链接的文档。

如果您需要传递多个参数compute,一个常见的模式(除了这个用例之外)是创建一个将类的字段序列化为Map<String, dynamic>,以及一个从 a 创建对象的工厂构造函数Map<String, dynamic>。如果使用反射,这个过程会更容易,但 Flutter 由于性能原因禁用了它。

有关完整示例compute来自 Flutter 文档,请参见此处:https://flutter.dev/docs/cookbook/networking/background-parsing https://flutter.dev/docs/cookbook/networking/background-parsing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart future 阻塞主线程 的相关文章

随机推荐

  • 表达 3.0 如何使用 app.locals.use 和 res.locals.use

    我在express3 0rc2上 如何使用app locals use 它还存在吗 和res locals use 我看到了这个https github com visionmedia express issues 1131 https g
  • 为什么 Range 有效,而 Cells 无效?

    我试图通过将一个范围内的值分配给另一个范围来将一些数据从一个工作簿移动到另一个工作簿中 当我使用正常的 Range 语法指定目标范围 Range A1 B2 时 我的代码可以工作 但是如果我尝试使用 Range Cells 语法 Range
  • 响应式视频播放器

    我需要一个使用 bootstrap 开发的响应式布局网站的视频播放器 这意味着当我重新调整屏幕大小或在不同尺寸的屏幕中查看页面时 播放器应该自动适合屏幕 我尝试过 jwplayer 和 flowplayer 但没有成功 http www l
  • 串行或并行调用多个ajax请求

    我有3个功能 load graphs national container natl rates container natl counts load graphs division Western container west rates
  • 添加 UIFont 并查找字体系列会因 EXC_BAD_ACCESS 崩溃

    我的问题是 当我添加描述的字体时here https stackoverflow com questions 3350131 how to add new font to xcode 3 2当我想检索字体系列名称时 UIFont famil
  • .NET Core 模板的 Markdown 语法是什么

    我有一个 NET Core 模板 https github com cilerler burcin blob master dist template config template json想知道如何根据设置的标志隐藏 markdown
  • XML 元素是否有标准的命名约定? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 XML 文档是否有任何标准 事实上的标准或其他标准 例如 哪种是编写标签的 最佳 方式
  • Java 中受保护的访问修饰符

    我在理解java中的受保护访问修饰符 或其背后的设计 时遇到了一些困难 我认为这意味着包访问和通过继承包含抽象成员的类的对象进行访问 我编写了以下示例代码 我发现如果未注释 注释掉的行会产生编译错误 为什么我可以通过 Second 中的 S
  • 是否可以在应用程序组件上使用 [ngClass],其中该类位于 Angular 6 的组件内部?

    我有一个 Angular 6 应用程序 我正在尝试将另一个 CSS 类应用到我的应用程序组件之一app component html文件 基本上 我想根据条件更改应用程序页脚的颜色 而所有其他情况都不显示页脚 所以 我的代码如下所示 应用程
  • 我的 Visual Studio 项目是 Web 应用程序还是网站?

    首先 什么时候使用什么以及它们之间的总体差异之前已经回答过 但我找不到这个问题的答案 在哪里可以检查我的 Visual Studio 项目是 Web 应用程序还是网站 区分网站和 Web 应用程序的最简单方法是查看项目的图标 Web Sit
  • C# IComparer 标准用法问题

    我有一个问题 这是否是在 C 中使用 IComparer 的标准 假设我有一个情况 其中有三个 Person 对象 P1 P2 和 P3 假设我调用 Compare 方法并传入 P1 和 P2 结果为 0 这本质上意味着两个人应该被归类为相
  • Rails 6 ActiveStorage 在文件上传失败时恢复事务

    我有一个非常简单的场景 我正在创建一条记录 然后附加一个文件 之后save 因为我需要记录上的 id 来生成附件的细名 所有这些都包含在事务中 就像是 def create ActiveRecord Base transaction do
  • 在服务器中实现自动完成的最佳方法是什么?

    这个问题很容易让人知道 让 Web 应用程序的客户端自动完成变得漂亮很简单 有很多插件 但是 在后端 在服务器端 最好的方法是什么 我不喜欢用户每次按下按键就访问数据库的想法 我一直在考虑 sphinx 或者一些与您的网站并行运行的全文搜索
  • 如何使用 Java2D 图形正确绘制点间距很近的粗线?

    我正在尝试使用 Java2D 绘制地图 当我的地图缩小时 我的道路上充满了绘画制品 这是绘制完整的美国州时屏幕的一小部分 放大后 这是一段相似的路段 使用的线条样式是一条蓝色实线 其宽度缩放为相当于 2 个像素 我尝试了各种渲染提示和行连接
  • 在 TeamCity 中创建变更日志工件

    是否有一种简单的方法可以让 TeamCity 包含文本或 html 更改日志作为其输出工件之一 也许我需要沿着让 msbuild 或其他进程创建更改日志的路线 但由于 TeamCity 为每个构建生成一个更改日志 我想知道是否已经有一种简单
  • Bootstrap-modal 在 Flash 顶部弹出

    我正在使用 Twitter 的 Bootstrap 插件bootstrap modal 除非后面有闪光灯元件 否则它效果很好 当引导模式对话框出现并且其后面有一个 Flash 元素时 Flash 元素位于其他所有元素之上 我该如何解决 您需
  • Ruby String#scan 相当于返回 MatchData

    正如问题标题中基本上所述 Ruby 字符串上是否有一种方法相当于字符串 扫描 http ruby doc org core String html method i scan但它不是只返回每个匹配的列表 而是返回一个数组MatchData是
  • 如何处理 SQL Server 中列名中的空格?

    假设我想使用这样的代码 select Response Status Code Client Response Status Code from TC Sessions NOLOCK WHERE StartDate BETWEEN 05 1
  • Oracle 数字和 varchar 连接

    我有一个连接两个表的查询 一个表的列类型为 varchar 另一表的列类型为 number 我已经在 3 个 Oracle 数据库上执行了查询 并且看到了一些奇怪的结果 希望能够得到解释 在其中两个数据库上 类似以下内容的工作 select
  • Dart future 阻塞主线程

    我正在开发一个捕获和处理图像的应用程序 代码的简化版本是 build return FloatingActionButton onPressed processImage child Icon Icons camera alt color