gpt4 book ai didi

flutter - 隔离器被杀死时, flutter 隔离器内的计时器不会停止

转载 作者:行者123 更新时间:2023-12-03 03:31:56 24 4
gpt4 key购买 nike

我有一个应用程序使用API​​调用将操纵杆位置数据上传到Web服务器。
移动操纵杆时将调用此方法。如果操纵杆不在中间,它将停止任何先前运行的隔离,并启动新的隔离。

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方法(隔离中的方法):
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会不断上传操纵杆的旧位置和新位置。我认为这是因为即使隔离被杀死,计时器仍会继续运行。
问题:
  • 为什么即使我杀死了隔离株,我的计时器仍继续运行(并上传)?
  • 当我杀死正在运行的隔离器时,如何使计时器停止运行?
  • 最佳答案

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

    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;
    }
    }

    关于flutter - 隔离器被杀死时, flutter 隔离器内的计时器不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63398204/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com