我知道当我不想再收到任何活动时,我必须取消Stream
次订阅.
传递给另一个流的addStream
个流会发生什么情况?它们是自动取消的吗?
同样的问题在StreamSink
侧,如果流已经完成,我是否必须关闭它们?
我知道当我不想再收到任何活动时,我必须取消Stream
次订阅.
传递给另一个流的addStream
个流会发生什么情况?它们是自动取消的吗?
同样的问题在StreamSink
侧,如果流已经完成,我是否必须关闭它们?
简而言之:no, but you should.在StreamSubscription
或溪流汇
requires关闭资源的合同中没有任何内容,但是如果您不关闭它们,一些用例可能会导致内存泄漏,即使在某些情况下,这样做可能会令人困惑.围绕这些类的念力的一部分是它们是重载的,并且处理两个截然不同的用例:
让我们用撞击逐一关注这些话题,首先,StreamSubscription
:
StreamSubscription
当你listen
分到Stream
分时,你会得到StreamSubscription
分.通常,当您正在收听Stream
时,无论出于什么原因,您都应该关闭订阅.如果 Select 不关闭,并不是所有的流都会泄漏内存,但是有些会泄漏-例如,如果您正在从文件读取输入,则不关闭流意味着文件的句柄可能保持打开状态.
所以,虽然不是strictly required,但当访问完流时,我会always cancel
.
溪流汇
溪流汇
最常见的实现是StreamController
,它是创建Stream
的编程接口.通常,当您的流是complete(即发出的所有数据)时,您应该关闭控制器.
这就是它变得有点令人困惑的地方.我们来看看这两个 case :
假设您正在创建一个API来逐行异步读取File:
Stream<String> readLines(String path);
要实现这一点,您可以使用StreamController
:
Stream<String> readLines(String path) {
SomeFileResource someResource;
StreamController<String> controller;
controller = new StreamController<String>(
onListen: () {
someResource = new SomeFileResource(path);
// TODO: Implement adding to the controller.
},
);
return controller.stream;
}
在这种情况下,当最后一行被读取时,close到controller
会很有意义.这会向用户发出文件已被读取并且有意义的信号(done事件)(例如,您可以在此时关闭File资源).
假设您正在创建一个API来收听HackerNews上的新闻文章:
Stream<String> readHackerNews();
在这里,它对于底层接收器/控制器close来说意义不大.黑客新闻有stop次吗?像这样的事件流(或UI程序中的click
个处理程序)在没有用户访问的情况下传统上不会"停止"(即取消StreamSubscription
).
完成后could关闭控制器,但这不是必需的.
希望这是有意义的,并帮助您解决问题!