假设我有一个长度为1,000,000的短裤数组,我需要在我的应用程序启动时和活动线程超时之前生成或加载到RAM中(理想情况下在几秒钟内)。
然后,我将在运行时快速访问其条目。
您如何从文件中将其加载到内存中?从txt文件加载?从SQLite文件(单个表中有两个整数列,一个用于索引,另一个用于值)?
活动是否有可能在被视为超时之前请求更长的空闲时间?
答案 0 :(得分:3)
问题的解决方案是生成一个线程来执行文件读取。这将是一个高级概述,因此您可以追踪相关项目。它将首先涉及第2项,然后是第1项。
首先,您需要从UI线程中获取长时间运行的处理。 “空闲”时间响应问题(应用程序没有响应)是因为您正在占用执行其他操作所需的UI线程。线程无法同时读取文件和绘制屏幕(至少不是很好)。
我发现最简单的方法是使用Java ExecutorServices。您要做的是将用于读取文件或数据库的逻辑打包到java Runnable或Callable中,然后使用ExecutorService运行它。执行程序将负责启动一个线程,并在它们不再使用时回收这些资源。
需要注意的一个关键问题是,一旦创建了另一个线程,在更新UI时需要小心。因为ui对象不是线程安全的,所以你只能从UI线程更新ui(常识,对吧?)。如果您在一个活动中,可以通过调用runOnUiThread()来执行此操作,或者您可以首先在UI线程调用的一个ACtivity方法中创建自己的Handler。
Sam Dufel说:嗯......如果你能用一种格式来替换所有虚拟条目只是一个计数,你真的可以把它打包下来。例如,10,000个零被一对标志字节替换为10,000
此外,您可能会通过生成多个读取线程来提高速度。如果你可以将文件分成两个文件,这两个文件允许两个线程同时执行,你可以看到显着的加速(取决于你需要对数据做什么)。从文件中加载数据是一种征服。粗略的谷歌搜索应该为您提供有关如何从文件加载短信的信息。您应该考虑使用符合规范的二进制格式。