【问题标题】:how to clear grow heap size in titanium app in android?如何在 android 的钛应用程序中清除增长堆大小?
【发布时间】:2014-06-06 06:14:41
【问题描述】:

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

错误:将堆(碎片情况)增加到 14.687MB 以分配 517197 字节

就像在 Core android System.gc(); 那么钛的选择有哪些

【问题讨论】:

  • 能否提供代码?

标签: android titanium titanium-mobile


【解决方案1】:

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

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

阅读钛官方文档here

【讨论】:

  • 这是我在回答中提到它时想到的标签之一。正如我所说的那样,根据我的经验,它并没有多大用处。
  • 我发现这个标签很有帮助,无论是原生的还是钛的
【解决方案2】:

据我所知,您无法控制垃圾收集。 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.

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


这三篇关于“保持您的应用响应”的文章很好地解释了我试图说明的观点:

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

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多