【问题标题】:Where is the leak in HTTPClientHTTPClient 的漏洞在哪里
【发布时间】:2020-01-19 08:48:04
【问题描述】:

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

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(第二代)12.4

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

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

感谢您的帮助

【问题讨论】:

    标签: memory-leaks titanium titanium-mobile titanium-alloy appcelerator-alloy


    【解决方案1】:

    我对代码做了一些改动(for循环,使用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/) 以便他们检查。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 2014-03-15
      • 2022-01-22
      • 2011-01-23
      • 2016-04-16
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多