dart - 可以删除对象后取消内部流订阅的模式?

标签 dart listener resource-cleanup

根据我对 Dart 的理解 StreamStreamSubscription.cancel() 之前,所有听众都将作为引用。叫做。这意味着在流也被销毁之前,我的监听对象不会从内存中删除。

一旦我不再需要该对象,是否有任何标准模式可以确保我取消所有内部监听器?这甚至是 Dart 中的一个问题,还是我误解了这个概念?

我能想到的一种解决方案是 destroycancelSubscriptions一旦我知道不再需要对象,就必须手动调用该方法。

最佳答案

如果订阅者和引用流的实例都受到垃圾收集(某些事件实例未引用)的影响,则连接不应该计算在内,并且两个实例都应该被垃圾收集(但我不确定这一点)。

我还没有看到任何模式。
当我只想取消所有订阅时,我将它们存储在一个集合中并运行

subscriptions.forEach(s) {
  s.cancel();
}
subscriptions.clear();

当我想在不同情况下取消重新订阅时,我会为每个此类订阅创建一个变量。

var someSubscr = xxx.listen(...);

...

if(someSubscr != null) someSubscr.cancel();
someScubscr = null;

我只在 Polymer 元素中使用它,我使用 detached退订和attached订阅。
当我在其他情况下需要时,我只需将上面的代码放入 dispose方法并在我知道不再需要该实例时调用它。

我认为创建一个接口(interface)并为应该具有 dispose 的类实现它会很好。方法。

abstract class Disposable {
  void dispose();
}

当您有某种工厂为您创建实例并且您不确定该实例是否需要调用 dispose 时当您完成使用它时,只需添加此行就可以确保安全。

if(x is Disposable) x.dispose();

有一个功能请求让 VM 调用析构函数或 dispose 方法
  • http://dartbug.com/3691

  • 但不确定是否会实现。

    还有相关的:
  • http://dartbug.com/2143
  • http://dartbug.com/18829
  • 关于dart - 可以删除对象后取消内部流订阅的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123034/

    相关文章:

    java - Akka:动态创建的 Actor 完成后需要清理它们吗?

    python - 设计python api。可靠的清理与在解释器中易于使用

    flutter - 如何在 InheritedWidget 中调用 setState 或更新值?

    c - TCP监听并在监听的同时做其他事情

    java - 听一个文件夹的变化java

    Java swing 三个相对组合框

    java - 线程池 - 每个任务创建一个新线程,检测一组任务何时完成

    firebase - 如何使用flutter从Firebase上传数据数组

    dart - 函数内部的final关键字

    ios - 如何使用 Flutter APP 在 IOS 设备上播放 HTTP 直播流?