首页 > 解决方案 > HTTPClient 的漏洞在哪里

问题描述

我已经解决这个问题好几天了,仍然无法找出问题所在。

HTTPClient 没有被正确清理,因此当循环下载 100 个图像时,应用程序内存正在爆炸。

我正在使用 appc new -t 钛创建的简单合金模板进行测试。

只用一个按钮打开一个索引视图来开始下载循环

我的索引文件如下所示:

var max = 100
var i = 0

var c = Ti.Network.createHTTPClient();
c.onerror = function () {
  c = null;
}
c.onload = function () {
  saveFile(this.responseData)
  console.log("done get")
  i++
  getfiles()
}

function getfiles () {

  if (i < max) {

    try {
      c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
      c.send();
    } catch (e) {

    }
  } else {
    c = null
    console.log("finished")
  }
}

function saveFile (response) {

  console.log("STORING")

  var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'FS4931.jpg');
  f.write(response);

  if (f.exists() === false) {
    console.log("NOT STORED")
  } else {
    console.log("STORED")
  }

  f = null;

}


$.index.open();

最初在应用程序启动后,内存位于 ca。30mb 到目前为止这么好单击索引页面上的获取图像按钮后,内存上升到 ca。62mb 然后过一段时间下降到 ca。50mb 留下 20mb 下落不明

我正在使用:Xcode 10.3 Ti SDK 版本 8.1.1.GA 模拟器:iPad Pro(第 2 代)在 12.4

在此处输入图像描述

将 max 更改为 1000 时,内存飙升至 322mb 左右,并且似乎不再减少。

当循环下载 2000 张图片时,这是一个非常大的问题,因为应用程序在某个时候会崩溃

感谢您的任何帮助

标签: memory-leakstitaniumtitanium-mobiletitanium-alloyappcelerator-alloy

解决方案


我对代码进行了一些更改(for-loop,使用file属性,不要重复使用 httpclient(查看文档),经典代码,因此测试速度更快):

var w = Ti.UI.createWindow();
var b = Ti.UI.createButton({
    title: "download"
});
w.add(b);

function onError(e) {
    console.log("error", e);
}

function onLoad(e) {
    console.log("done get")
}

function getfiles(e) {
    for (var i = 0; i < 100; ++i) {
        var c = Ti.Network.createHTTPClient({
            onerror: onError,
            onload: onLoad
        });
        c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
        var fname = Ti.Filesystem.applicationSupportDirectory + "/" + (new Date().getTime()) + ".jpg";
        console.log("Download to", fname);
        c.file = fname;
        c.send();
        c = null;
        fname = null;
    }
}
b.addEventListener("click", getfiles);
w.open();

当它释放内存(大约 5mb)时,我得到了一点开销。您可以创建 JIRA 票证 ( https://jira.appcelerator.org/ ),以便他们检查。


推荐阅读