如何获取对已经 运行 隔离的引用?
How to get a reference to an already running isolate?
如何在 Flutter 应用程序启动期间获取对已经 运行ning 隔离的引用?
想象一个 Futter 应用程序在 Isolate 中执行其所有工作。 Isolate 可以 运行 持续将近一个小时,即使该应用程序已置于后台(顺便说一句,目前运行良好)。如果在 isolate 已经 运行ning 时再次启动应用程序,就会出现问题,这会导致应用程序挂起。
所以问题是,如何检测 isolate 是否已经 运行ning,以及如何获取它的句柄?
由于我的评论没有得到提问者的回复,我在这里提供更详细的建议。欢迎大家评论,我会根据反馈进行更新。
首先,尝试简单地按照教程进行操作:https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124
其次,IsolateNameServer 似乎很有希望。查看它的实现,我们看到:
class IsolateNameServer {
...
static SendPort? lookupPortByName(String name) {
...
return _lookupPortByName(name);
}
...
static SendPort? _lookupPortByName(String name)
native 'IsolateNameServerNatives_LookupPortByName';
static bool _registerPortWithName(SendPort port, String name)
native 'IsolateNameServerNatives_RegisterPortWithName';
static bool _removePortNameMapping(String name)
native 'IsolateNameServerNatives_RemovePortNameMapping'
}
...
Dart_Handle IsolateNameServerNatives::LookupPortByName(
const std::string& name) {
auto name_server = UIDartState::Current()->GetIsolateNameServer();
if (!name_server) {
return Dart_Null();
}
Dart_Port port = name_server->LookupIsolatePortByName(name);
if (port == ILLEGAL_PORT) {
return Dart_Null();
}
return Dart_NewSendPort(port);
}
...
因此,它没有在 Dart 中实现,而是在本地实现,所以可能后台 isolate 可以注册自己,主 isolate 可以使用它来找到它。
试试看,如果不行,请评论,我会更新。
如何在 Flutter 应用程序启动期间获取对已经 运行ning 隔离的引用?
想象一个 Futter 应用程序在 Isolate 中执行其所有工作。 Isolate 可以 运行 持续将近一个小时,即使该应用程序已置于后台(顺便说一句,目前运行良好)。如果在 isolate 已经 运行ning 时再次启动应用程序,就会出现问题,这会导致应用程序挂起。
所以问题是,如何检测 isolate 是否已经 运行ning,以及如何获取它的句柄?
由于我的评论没有得到提问者的回复,我在这里提供更详细的建议。欢迎大家评论,我会根据反馈进行更新。
首先,尝试简单地按照教程进行操作:https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124
其次,IsolateNameServer 似乎很有希望。查看它的实现,我们看到:
class IsolateNameServer {
...
static SendPort? lookupPortByName(String name) {
...
return _lookupPortByName(name);
}
...
static SendPort? _lookupPortByName(String name)
native 'IsolateNameServerNatives_LookupPortByName';
static bool _registerPortWithName(SendPort port, String name)
native 'IsolateNameServerNatives_RegisterPortWithName';
static bool _removePortNameMapping(String name)
native 'IsolateNameServerNatives_RemovePortNameMapping'
}
...
Dart_Handle IsolateNameServerNatives::LookupPortByName(
const std::string& name) {
auto name_server = UIDartState::Current()->GetIsolateNameServer();
if (!name_server) {
return Dart_Null();
}
Dart_Port port = name_server->LookupIsolatePortByName(name);
if (port == ILLEGAL_PORT) {
return Dart_Null();
}
return Dart_NewSendPort(port);
}
...
因此,它没有在 Dart 中实现,而是在本地实现,所以可能后台 isolate 可以注册自己,主 isolate 可以使用它来找到它。
试试看,如果不行,请评论,我会更新。