如何在Android中的钛应用程序中清除增长堆大小?

use*_*214 5 android titanium titanium-mobile

我已经下载了100个图像存储在应用程序数据目录中它工作正常,但我已经下载了更多的图像然后增加堆大小问题即将到来并且应用程序已关闭.我已删除所有对象,对象的值定义null和窗口也关闭但结果是相同.

错误:将堆(frag case)增长到14.687MB,用于517197字节分配

就像Core android System.gc(); 那么钛的选择是什么呢?

kas*_*rch 0

据我所知,你无法控制垃圾收集。JavaScript 解释器会为您完成此操作。

我在一个项目中做了类似的事情(下载大量图像),也遇到了内存问题。我发现的最佳解决方案是确保垃圾收集是可能的。原因是 JavaScript 解释器执行您的代码,如果您循环遍历所有图像并下载它们,它可能无法在下载完成之前进行垃圾收集。这意味着所有临时图像仍将保留在内存中。

要解决这个问题,您需要使用underscore.jsdefer的 - 方法或- 函数。从某种意义上说,它们所做的就是告诉解释器可以在此之前运行其他东西,例如垃圾收集。setTimeout

此代码示例(使用 underscore.js)应该可以让您了解总体思路:

var images = [...many entries here...]; 

function downloadImage(index) {
  //Make sure the index is valid
  if(index < images.length) {
    var httpClient = Ti.Network.createHttpClient({
       onload: function() {
         //Save the image to the filesystem.
         _defer.(downloadImage, ++index); //Download the next image.
       }
    });

    //Run the HttpClient here.
  }
}

_.defer(downloadImage, 0); //Start the download sequence.
Run Code Online (Sandbox Code Playgroud)

您还可以在 tiapp.xml 文件中设置一些标签,但根据我的经验,它们没有多大帮助。


这三篇关于“保持应用程序响应”的文章很好地解释了我想要表达的观点:

  1. 第 1 部分:问题
  2. 第 2 部分:原因
  3. 第 3 部分:解决方案