如何解决隔离器被杀死时,颤振隔离器内的计时器不会停止
我有一个应用程序通过API调用将操纵杆位置数据上传到Web服务器。
移动操纵杆时将调用此方法。如果操纵杆不在中间,它将停止任何先前运行的隔离,并开始新的隔离。
{
"onboardingInformation": {
"apiInvokerPublicKey": "NEW VALUE","apiInvokerCertificate": "string","onboardingSecret": "string"
},"notificationDestination": "string","requestTestNotification": true
}
隔离启动和停止方法
void onJoystickMoved(double angle,double distance) {
stopIsolate();
if(distance > 0.06){
startIsolate(JoystickPosition.fromDistanceAndRadius(distance,angle));
}
}
uploadJoystickPosition方法(隔离中的方法):
Future<void> startIsolate(JoystickPosition position) async {
isolate = await Isolate.spawn(uploadJoystickPosition,position);
}
void stopIsolate() {
if (isolate != null) {
debugPrint("Stopping isolate");
isolate.kill();
isolate = null;
}
}
问题在于uploadJoystickPosition会继续上传操纵杆的旧位置以及新位置。我认为这是因为即使隔离器被杀死,计时器也会继续运行。
问题:
- 即使杀死了隔离株,为什么我的计时器仍继续运行(并上传)?
- 当我杀死正在运行的隔离器时,如何使计时器停止运行?
解决方法
正如我在评论中指出的那样,您的示例代码具有:
Future<void> startIsolate() async {
stopIsolate();
isolate =
await Isolate.spawn(isolateMethod,DateTime.now().toIso8601String());
}
void stopIsolate() {
if (isolate != null) {
debugPrint("Stopping isolate");
isolate.kill();
isolate = null;
}
}
在对startIsolate
的另一个调用已进行时,没有阻止startIsolate
的调用。因此,您的问题不在于杀死隔离株不会停止其Timer
,而是您泄漏隔离株并阻止自己杀死它们。您需要添加防护,以避免在另一个创建请求正在进行时生成新的隔离。 bool
就足够了:
bool isStartingIsolate = false;
Future<void> startIsolate() async {
if (isStartingIsolate) {
// An isolate is already being spawned; no need to do anything.
return;
}
stopIsolate();
isStartingIsolate = true;
try {
isolate =
await Isolate.spawn(isolateMethod,DateTime.now().toIso8601String());
} finally {
isStartingIsolate = false;
}
}
如果您要等待待处理的startIsolate
调用完成然后再处理任何新的调用,则采用另一种方法:
Future<void> pendingStartIsolate;
Future<void> startIsolate() async {
while (pendingStartIsolate != null) {
await pendingStartIsolate;
}
stopIsolate();
try {
pendingStartIsolate =
Isolate.spawn(isolateMethod,DateTime.now().toIso8601String());
isolate = await pendingStartIsolate;
} finally {
pendingStartIsolate = null;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。