我正在开发一个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。是否有任何方法可以检测隔离区是否仍在运行?
- 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。是否有任何方法可以检测隔离区是否仍在运行?