【问题标题】:Can large String Arrays freeze my program?大型字符串数组可以冻结我的程序吗?
【发布时间】:2011-04-23 09:15:14
【问题描述】:

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

该程序运行良好,但在创建数组时会冻结(大约 16 秒,具体取决于大小)。

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

【问题讨论】:

    标签: android xml optimization


    【解决方案1】:

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

    线程

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

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

    数据存储

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

    配置更改

    最后,确保在发生配置更改(例如方向更改)时不必重新构建您的数据。持久的 SQLite 数据库可以提供帮助,these 方法也可以。

    【讨论】:

    • 谢谢,但我无法控制提供给我的数据:s(该网站不是我的)
    • 好的,我已经尝试过这个线程的东西/异步任务,但是当调用“.execute”方法时程序崩溃了。关于异步任务类中我应该/不应该发生的事情是否有任何规则/建议? (对不起,我是新手:|)
    • @Nick 我的意思是本地 SQLite 数据库。我提到的所有优化都在您的控制之下。关于 AsyncTask 崩溃,最好将代码发布在单独的问题中。
    【解决方案2】:

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

    【讨论】:

    • +1:这确实可以加快速度。对中等大的输入进行 DOM 解析需要多少内存和时间,这让我感到惊讶。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多