当隔离被杀死时,颤振隔离内的计时器不会停止

2023-12-07

我有一个应用程序使用 API 调用将操纵杆位置数据上传到网络服务器。

当操纵杆移动时会调用此方法。如果操纵杆不在中心,它将停止任何先前运行的隔离并启动新的隔离。

void onJoystickMoved(double angle, double distance) {
stopIsolate();
if(distance > 0.06){
  startIsolate(JoystickPosition.fromDistanceAndRadius(distance, angle));
}
}

隔离启动和停止方法

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方法(isolate中的方法):

void uploadJoystickPosition(JoystickPosition position){

   Timer.periodic(new Duration(seconds: 1), (Timer t) {
      DataModel dataModel = DataModel(1, getTimeInSeconds());
      dataModel.joystickPosition = position;
      debugPrint("Distance: ${position.distance}");
      uploadData(dataModel).then(uploadResponse, onError: uploadError);
   });
}

问题是 uploadJoystickPosition 不断上传操纵杆的旧位置和新位置。我假设这是因为即使隔离被杀死,计时器也会继续运行。

问题:

  1. 为什么我的计时器在我杀死隔离体后仍继续运行(并上传)?
  2. 当我杀死运行中的隔离体时,如何让计时器停止?

正如我在评论中指出的,您的示例代码具有:

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已经在进行中。因此你的问题不在于杀死一个分离株并不能阻止它Timers,就是你leak隔离并防止自己杀死它们。您需要添加一个防护以避免在另一个创建请求正在进行时产生新的隔离。 Abool就足够了:

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;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当隔离被杀死时,颤振隔离内的计时器不会停止 的相关文章

随机推荐