大型String Arrays可以冻结我的程序吗?

时间:2010-10-10 05:38:21

标签: android xml optimization

我最近创建了一个程序,它获取大量的xml数据并将其转换为字符串数组,然后显示数据。

该程序运行良好,但它在制作阵列时会冻结(大约16秒,具体取决于大小)。

有什么方法可以优化我的程序(字符串数组的替代品等)。

3 个答案:

答案 0 :(得分:3)

应该有所帮助的3个优化:

线程

如果程序冻结,则很可能意味着您没有使用单独的线程来处理大型XML文件。这意味着您的应用必须等到此任务完成后再次响应。

相反,创建一个新线程来处理XML并在完成后通过Handler通知主线程,或者使用AsyncTask。这将更详细地解释here

数据存储

此外,本地SQLite数据库可能更适合存储大量数据,特别是如果您不必一次显示所有数据。这可以通过平台提供的游标来实现。

配置更改

最后,确保在发生配置更改(例如方向更改)时不必重建数据。持久的SQLite数据库可以帮助解决这个问题以及these方法。

答案 1 :(得分:1)

您可以使用SAX处理XML流,而不是尝试解析整个文件并在内存中生成DOM。

答案 2 :(得分:0)

如果您发现自己确实使用了太多内存,并且有理由将字符串保留在内存中而不是将其缓存在磁盘上,那么肯定有办法可以减少内存需求。令人遗憾的是,Java字符串占用了大量空间。它们需要两个对象(字符串本身和底层字符数组),并且每个字符使用两个字节。如果您的数据主要是7位ASCII,那么最好将其保留为UTF-8编码字节流,在典型情况下每个字符使用1个字节。

一种非常有效的方案是维护一个32k字节缓冲区的数组,并将每个新字符串的UTF-8表示附加到其中一个数组中的第一个空白空间。您对字符串的引用变为一个简单的整数:PTR =(缓冲区索引* 32k)+(缓冲区偏移量)。 “PTR / 32k”产生所需字节缓冲区的索引,“PTR%32k”产生缓冲区内的位置。使用初始长度字节或空终止符来跟踪字符串的长度。当您需要访问其中一个字符串时,请不要分配新的String对象:将其解压缩到可变的StringBuilder中或直接使用UTF-8字节表示。

上面的方法显然需要做很多工作,但是在内存使用量上可以节省2到6倍(取决于字符串的长度)。但是,您应该注意过早优化。如果您的问题在于解析输入的处理时间,或者在程序中的其他位置,您可能会发现您已经做了大量工作来修复不是瓶颈的事情,因此根本没有任何改进。