Flutter、Moor 和 WorkManager

Flutter, Moor and WorkManager

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

由于我们需要以 "thread-safe" 方式使用数据库,因此我们尝试使用 Moor 数据库框架,通过 moor_ffi 接口与 SQLite 服务器通信。

Moor 声称通过生成第三个 Isolate (MoorIsolate) 来实现它 "thread-safety"。这个 isolate 是唯一一个与数据库对话的。在 BG 和 FG 中执行的查询使用 SendPort/ReceivePort 发送到此隔离,执行并返回给调用者隔离。

但是,所有 Moor 示例都建议从 FG isolate 中生成 MoorIsolate。这让我注意到以下问题。

  1. 如果 FG 隔离 "dies"

    ,MoorIsolate 会发生什么

    1.1 如果用户在 Navigator 的最后一个屏幕上按返回按钮退出?

    1.2 如果APP一段时间不可见,OS决定释放内存。

    1.3 如果用户 "force-kills" 应用程序在设置中(理想情况下,这应该是 MoorIsolate 死亡的唯一情况)

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

经过与moor开发人员的沟通和我自己的经验测试,我得出以下结论:

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