【问题标题】:How to get a reference to an already running isolate?如何获取对已经运行的隔离的引用?
【发布时间】:2021-09-05 20:42:18
【问题描述】:

如何在 Flutter 应用启动期间获得对已运行隔离的引用?

想象一个 Futter 应用程序,它在 Isolate 中执行所有工作。即使将应用程序置于后台(顺便说一句,到目前为止运行良好),Isolate 也可以运行近一个小时。如果在隔离已运行时再次启动应用程序,则会出现问题,导致应用程序挂起。

所以问题是,如何检测隔离是否已经在运行,以及如何获取它的句柄?

【问题讨论】:

  • 如果隔离已经在运行,如何在打开时再次启动应用程序?
  • @iDecode 这是我要解决的问题之一。
  • 您好,请问有什么问题,如果您只是按照“在后台执行飞镖”教程medium.com/flutter/…
  • 那么,使用 IsolateNameServer api.flutter.dev/flutter/dart-ui/IsolateNameServer-class.html 怎么样?
  • IsolateNameServer 就是这样!在 Isolate 文档中提到那个会很有用。感谢您指出!

标签: flutter dart-isolates


【解决方案1】:

由于我的cmets没有得到提问者的回复,我在这里提供一个更详细的建议。欢迎发表评论,我会根据反馈进行更新。

首先,尝试简单地按照教程进行操作: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'
}

和 c++ 代码:https://blog.weghos.com/flutter/engine/flutter/lib/ui/isolate_name_server/isolate_name_server_natives.cc.html

...
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 中实现的,而是原生实现的,所以可能后台隔离可以注册自己,主隔离可以使用它来找到它。

试试看,如果不行,请评论,我会更新。

【讨论】:

  • 抱歉耽搁了,花了一点时间才让一切正常运行。 IsolateNameServer 是缺失的部分!
  • 恭喜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多