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

如何在android中清除Tianium应用程序中的堆大小增长?,android,titanium,titanium-mobile,Android,Titanium,Titanium Mobile,我已经下载了100个图像存储在应用程序数据目录中,工作正常 但我下载了更多的图像,然后堆大小增长问题就来了,应用程序关闭了。我删除了所有对象,对象的值定义为null,窗口也关闭了,但结果是一样的 错误:为517197字节分配将堆(frag大小写)增长到14.687MB 与核心android System.gc()类似; 那么钛的选项是什么呢?据我所知,您无法控制垃圾收集。JavaScript解释器会为您完成这项工作 我在一个项目中做了类似的事情(下载了很多图片),也遇到了内存问题。我发现的最佳解

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

错误:为517197字节分配将堆(frag大小写)增长到14.687MB

与核心android System.gc()类似;
那么钛的选项是什么呢?据我所知,您无法控制垃圾收集。JavaScript解释器会为您完成这项工作

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

要处理此问题,您需要使用的
defer
-方法或
setTimeout
-函数。从某种意义上说,他们都是这样做的,他们告诉解释器在此之前运行其他东西是可以的,例如垃圾收集

此代码示例(使用下划线.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.
var images=[…此处有许多条目…];
函数下载图像(索引){
//确保索引有效
如果(索引
在tiapp.xml文件中还可以设置一些标记,但根据我的经验,它们没有多大帮助


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

  • 为什么不使用


    你能提供代码吗?这是我在回答中提到它时想到的标签之一。正如我在那里所说的,根据我的经验,这个标签并没有多大用处。我发现这个标签很有用,无论是在土生土长的还是钛制的
      <android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <application android:largeHeap="true"/>
    </manifest>