一旦可以删除对象,取消内部流订阅的模式?

时间:2014-09-30 14:13:51

标签: dart listener resource-cleanup

根据我对Dart' Stream的理解,任何听众都会被作为参考,直到StreamSubscription.cancel()被召唤为止。这意味着在流被销毁之前,我的侦听对象不会从内存中删除。

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

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

1 个答案:

答案 0 :(得分:1)

如果订阅者和引用该流的实例都受垃圾收集(未被某些活动实例引用),则连接不应计算,并且两个实例都应该被垃圾收集(但我不确定)

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

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

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

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

...

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

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

我认为创建一个接口并为应该使用dispose方法的类实现它会很好。

abstract class Disposable {
  void dispose();
}

如果您有某种工厂为您创建实例,并且您不确定实例是否需要在完成使用后调用dispose,那么只需添加此行即可安全

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

有一项功能请求要求VM调用析构函数或dispose方法

但不确定这是否会实施。

也相关: