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] 中的函数