【问题标题】:Flutter, Moor and WorkManagerFlutter、Moor 和 WorkManager
【发布时间】:2020-06-18 14:31:58
【问题描述】:

我正在开发一个 Flutter 应用程序(当时仅适用于 Android,但计划稍后支持 iOS)。该应用程序以两种方式运行:

  • Flutter UI 与大部分业务逻辑(前台隔离,从 main 方法开始)(FG)
  • 使用 android WorkManager(使用 Flutter Background Isolate)(BG)在后台执行的一些自动任务
  • 两个分离株都在使用数据库

由于我们需要以“线程安全”的方式使用数据库,因此我们尝试使用 Moor 数据库框架,通过 moor_ffi 接口与 SQLite 服务器对话。

Moor 声称通过生成第三个 Isolate (MoorIsolate) 来实现其“线程安全”。此隔离是唯一与数据库对话的隔离。在 BG 和 FG 中执行的查询使用 SendPort/ReceivePort 发送到此隔离,执行并返回给调用者隔离。

但是,所有 Moor 示例都建议从 FG 隔离中生成 MoorIsolate。这引起了我对以下问题的关注。

  1. 如果 FG Isolate “死亡”,MoorIsolate 会发生什么

    1.1 如果用户在 Navigator 的最后一屏按返回键退出?

    1.2 如果APP一段时间不可见,操作系统决定释放内存。

    1.3 如果用户在设置中“强制杀死”应用程序(理想情况下,这应该是 MoorIsolate 死掉的唯一情况)

  2. 在 BG 隔离中,我们使用 IsolateNameServer 来构造 MoorIsolate。有什么方法可以检测 Isolate 是否仍在运行?

【问题讨论】:

    标签: flutter dart-isolates flutter-moor


    【解决方案1】:

    在与 moor 开发商沟通后,我自己的经验测试得出以下结论:

    • 如果孤立体死亡,从它生成的所有孤立体都会随之死亡。这意味着,如果 MoorIsolate 是从 FG 隔离中生成的,并且 FG 隔离被任何方法停止,MoorIsolate 将随之消亡。
    • moor_ffi 为 Android 提供了线程安全的 sqlite 版本。这意味着可以在 FG 中生成 MoorIsolate 并为 BG 分离 MoorIsolate(或根本没有 MoorIsolate)。
    • IsolateNameServer 是在 FG 和 BG 隔离之间传递端口的唯一方法。但是,仍然可能存在竞争条件。

    【讨论】:

    • 那么你的意思是我什至不必生成 MoorIsolate 并且 android 后端仍然是线程安全的?那么整件事的意义何在?如果是这种情况,文档就极具误导性!
    • 在 FG 上不使用 MoorIsolate,所有查询都会阻止 gui 重绘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2021-08-30
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多