android - Android 中如何将资源复制到缓存?

标签 android caching assets

我需要将所有文件从 Assets 文件夹复制到 Android 缓存以更快地加载此数据。主要原因是在应用程序启动期间加载一次。在整个应用程序生命周期中,我可以从缓存中访问所需的文件,这可能会更快。我在互联网上搜索但一无所获。怎么做?

最佳答案

一个 Android“缓存目录”是通过在某些 Context 上调用 getCacheDir() 来获取的,例如 IntentServiceJobIntentService 。将 Assets 中的一堆内容复制到文件系统上的文件中需要一些时间,因此具有后台线程的 Service 可能是合适的。进行实际的复制是这样的:

  • AssetManager 获取所需资源的 InputStream
  • 获取要写入内容的位置的 FileOutputStream,例如 getCacheDir() 内的文件
  • 使用标准 Java I/O 复制字节

但是,请理解“缓存”并不是您为了提高应用程序速度而散布在应用程序上的魔法仙尘。例如,getCacheDir() 并不比 getFilesDir()getExternalCacheDir()getExtenalFilesDir() 快>,因为它们都指向相同的硬件(在大多数设备上)。文件系统上的文件可能比 Assets 的访问速度更快,因为 Assets 存储在 APK 中,需要一些工作才能从 APK 中读取它们。所以,这可能会有所帮助。

但是,由于您没有使用方法跟踪,或 Log 语句,或任何东西来确定您的时间花在哪里,所以您完全有可能完成这项工作而没有获得任何网络信息改进。例如,my main book以 APK 等格式发布。该书有 200 多章,全部以 HTML 形式存储在资源中。我没有发现加载 HTML 的速度特别慢。由于您在这些页面中所做的事情的性质,使用文件而不是资源对您的帮助可能比对我的帮助更大。

但您的性能问题也可能来自:

  • JavaScript 做了太多工作
  • 忘记您正在从网络下载大量内容,因为它们的 URL 隐藏在某个地方(例如 CSS 文件中引用的图像),并且下载这些图像需要一段时间
  • 您在应用中执行其他操作,同时尝试加载此 Web 内容,导致设备的 CPU 过载
  • 等等

关于android - Android 中如何将资源复制到缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551183/

相关文章:

android - Android下线程的替代方式

android - java.lang.IllegalArgumentException : View not attached to window manager 异常

html - 为什么包含 "apple-mobile-web-app-capable"标记会破坏我的网络应用程序在 iOS 上的离线功能?

caching - Kepler 中的 L2 缓存

ios - 如何调整所有 Apple 设备的图像资源大小? (不是启动图像)

ruby-on-rails - 将 S3/CloudFront 与 Rails 3 Assets 和更少的 CSS 结合使用

ruby-on-rails - SASS:从样式表中的另一个目录导入 bourbon lib

java - ViewGroup 动画不工作

c# - 是否有可移植类库的内存缓存?

android - 从我的回收适配器的点击功能传递数据