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

时间:2014-06-06 06:14:41

标签: android titanium titanium-mobile

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

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

喜欢Core android System.gc(); 那么什么是钛的选择

2 个答案:

答案 0 :(得分:2)

为什么不使用 android:largeHeap="true"

  <android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
    <application android:largeHeap="true"/>
</manifest>

阅读钛官方文档here

答案 1 :(得分:0)

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

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

要解决此问题,您需要使用defer - underscore.js方法或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.

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


这三篇文章关于&#34;保持应用响应&#34;解释我试图做得很好的观点:

  1. Part 1: The problem
  2. Part 2: The reason
  3. Part 3: The solution