【问题标题】:Loading a large array of shorts in Android在 Android 中加载大量短裤
【发布时间】:2011-01-19 05:53:26
【问题描述】:

假设我有一个长度为 1,000,000 的短裤数组,并且我需要在我的应用程序启动时和活动线程超时之前生成或加载到 RAM(最好在几秒钟内)。

然后我可以在运行时快速访问它的条目。

  1. 您将如何将其从文件加载到内存中?从txt文件加载?来自 SQLite 文件(单个表中有两个整数列,一个用于索引,另一个用于值)?

  2. 活动是否可以在被视为超时之前请求更长的空闲时间?

【问题讨论】:

  • 如果你只想按线性顺序加载数据,我想最快的方法是二进制数据文件。
  • @Sam:如果我插入一些虚拟(零)条目,这是有可能的。数组中条目的位置很重要,我并不关心数组的所有索引 - 只有大约四分之一,不规则分布,有用。
  • 嗯...如果您可以提供一种格式来仅用计数替换所有虚拟条目,那么您真的可以将其打包。例如,10,000 个零被一对标志字节替换,后跟 10,000

标签: android arrays


【解决方案1】:

解决您的问题的方法是生成一个线程来读取文件。这将是一个高级概述,因此您可以跟踪相关项目。它将首先处理第 2 项,然后是第 1 项。

首先,您需要从 UI 线程中获取长时间运行的处理。 “空闲”时间响应问题(应用程序无响应)是因为您正在占用执行其他操作所需的 UI 线程。线程不能同时读取文件和绘制屏幕(至少不好)。

我发现最简单的方法是使用 Java ExecutorServices。您要做的是将用于读取文件或数据库的逻辑打包到 java Runnable 或 Callable 中,然后使用 ExecutorService 运行它。执行器将负责启动一个线程并在它们不再使用时回收这些资源。

需要注意的一个关键问题是,一旦创建另一个线程,更新 UI 时需要小心。因为 ui 对象不是线程安全的,所以只能从 UI 线程更新 ui(常识,对吧?)。如果您在一个活动中,您可以通过调用 runOnUiThread() 来完成此操作,或者您可以在 UI 线程首先调用的其中一个活动方法中创建自己的处理程序。

Sam Dufel 说:

嗯...如果您可以提供一种格式来仅用计数替换所有虚拟条目,那么您真的可以将其打包。例如,10,000 个零被一对标志字节替换,后跟 10,000

此外,您可能会通过生成多个读取线程来提高速度。如果您可以将文件分成两个文件,这将允许两个线程同时执行,您会看到显着的加速(取决于您需要对数据执行的其他操作)。从文件加载数据的一种分治法。粗略的谷歌搜索应该为您提供有关如何从文件中加载短裤的信息。根据您的规范,您绝对应该考虑使用二进制格式。

【讨论】:

  • 当你在这里时,我已经有一些工作了,我将不得不担心稍后的加载时间。我的应用程序要求 Android 设备进行相当苛刻(但非常优化)的计算。如果我的应用程序可以在计算过程中占用处理器以便在合理的时间内完成它们,那就太好了。这可能吗(没有产生我自己的 100 个线程来主宰!)? (翻看 Android 文档好像不是,到处都是线程。)在新 iPhone 上计算只需要 0.1 秒,但在 Android 模拟器(来自 Eclipse)中需要 13 秒。
  • 在 Dalvik 之外跑步怎么样?即NDK?
  • 这些计算是基于模拟器的性能吗?一般来说,模拟器很慢。 NDK处理我不能多说,因为我没用过。 Android 是一个沙盒环境,所以我知道实际上没有一种机制可以影响另一个 vm 中的线程。如果您的计算运行缓慢,请查看 android profiler 工具。我没有理由相信 iPhone 应该能够在原始计算中超过 android 2 个数量级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2012-08-04
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多