Angular 4 + Http 不是 Cordova 中收集的垃圾

Posted

技术标签:

【中文标题】Angular 4 + Http 不是 Cordova 中收集的垃圾【英文标题】:Angular 4 + Http not garbage collected in Cordova 【发布时间】:2017-03-29 00:38:05 【问题描述】:

我有一个场景,我需要使用 GET 请求每 30 秒轮询一次服务并将其存储以供 UI 显示。我已经将我的 GET 请求包装在一个 30000 毫秒的 setInterval 中。我看到的是,在浏览器中的每次调用之后,内存都会在 100k 到 200k 之间攀升。在大约 8mb 左右之后,浏览器会正确地进行垃圾收集,并且 mem 会下降 4-5mb。

我的问题是,使用 Cordova 6.5 包装的这个应用程序,在应用程序崩溃之前,内存会攀升大约 4 天。崩溃日志显示与内存耗尽有关的问题。我还使用 xCode 检查了正在运行的应用程序,并注意到与我在浏览器中看到的相同的内存攀升,它永远不会被收集。我倾向于认为在 setInterval 调用中实例化的 Observable 的垃圾收集存在一些问题。

我创建了一个 plunkr 来显示内存攀升。寻找 1)为什么会发生这种情况,以及 2)如何纠正它而不必破坏视图并重新加载它(这是我暂时采用的方法)。

Plunkr

setInterval(() => 
  this.http.get('./people.json')
  .subscribe((response) => 
      this.people = response;
    , (err) => 
      //console.log('Error');
    );
, 15000);

环境: Angular 4.0.0 / RxJS 5.2.0 / @angular/http 4.0.0 / Cordova 6.5 / ios 10.3

【问题讨论】:

你对“人”的价值做了什么? 与 plunkr 中的相同。只是存储它并每 30 秒覆盖一次。 people 对象上有一些键绑定到 UI,例如 people.name ,准确地说是 2。 也许this 会有所帮助。 【参考方案1】:

使用 .unsubscribe。在每个间隔中,您都会设置一个新订阅。

【讨论】:

http observable 在 Angular 中自动取消订阅。

以上是关于Angular 4 + Http 不是 Cordova 中收集的垃圾的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cordova 应用程序中升级 Angular 2 版本

Angular 4.3 - HTTP 拦截器 - 刷新 JWT 令牌

Angular $http 正在发送 OPTIONS 而不是 PUT(不是 POST)

我们是不是需要取消订阅 Angular 中的 http 调用? [复制]

Angular $http 正在发送 OPTIONS 而不是 PUT/POST

带有 TypeScript 错误的 Angular HTTP GET http.get(...).map 不是 [null] 中的函数