3

我正在开发一个颤振应用程序(当时仅适用于 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 如果用户在导航器的最后一个屏幕上按返回按钮退出?

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

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

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

4

1 回答 1

2

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

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