Flutter,Moor 和 WorkManager

3
我正在开发一个Flutter应用程序(目前只为Android设计,但计划以后支持iOS)。该应用程序有两种工作方式:
- Flutter UI与大部分业务逻辑(前台isolate,使用main方法启动)(FG) - 使用Android WorkManager执行的一些自动任务背景操作(使用Flutter后台Isolate)(BG) - 两个隔离区均使用Database 由于我们需要在“线程安全”的情况下使用数据库,因此我们尝试使用Moor数据库框架,并使用moor_ffi接口与SQLite服务器通信。
Moor声称通过生成第三个Isolate(MoorIsolate)来实现其“线程安全”。这个隔离区是唯一一个与数据库交互的隔离区。在BG和FG中执行的查询会使用SendPort/ReceivePort发送到这个隔离区,然后被执行并返回给调用者隔离区。
然而,所有Moor示例都建议从FG隔离区生成MoorIsolate。这引起了我以下担忧的注意:
1.如果FG隔离区“死亡”,MoorIsolate会发生什么情况?
- 如果用户通过Navigator上的最后一个屏幕上的后退按钮退出? - 如果应用程序有一段时间不可见,操作系统决定释放其内存? - 如果用户在设置中“强制停止”应用程序(这应该是MoorIsolate死亡的唯一情况)?
2.在BG隔离区中,我们使用IsolateNameServer构建MoorIsolate。是否有任何方法可以检测隔离区是否仍在运行?
1个回答

2

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

  • 如果隔离器(isolate)死亡,则所有从它产生的隔离器也会一起死亡。这意味着,如果MoorIsolate是从FG隔离器产生的,并且FG隔离器被任何方法停止,MoorIsolate将会随之死亡。
  • moor_ffi为Android提供了线程安全版本的sqlite。这意味着在FG中生成MoorIsolate以及单独为BG生成MoorIsolate(或者根本不使用MoorIsolate)都是可以的。
  • IsolateNameServer是将端口传递给FG和BG隔离器的唯一方式。但是仍然可能存在竞态条件。

那么你的意思是我甚至不需要生成一个MoorIsolate,Android后端仍然是线程安全的吗?那整个东西的意义是什么呢?如果是这样的话,文档就极具误导性了! - n00bmind
如果在FG上不使用MoorIsolate,所有的查询都会阻塞 GUI 重绘。 - Martin Hlavňa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接