题
我的应用程序使用了大量从互联网下载并缓存在 Android 手机本地的图片。我想知道保存这些图片的正确方法是什么。我认为有几种方法并不完全令人满意。
将它们保存在 SD 卡上的公共文件夹中
- 占用卸载时不会释放的空间
- 用户可以在图库中查看图片
- 需要在SD卡根目录上有一个文件夹(您实际上可以在浏览手机时看到它)
将它们保存在 SD 卡上的非公共文件夹中
- 占用卸载时不会释放的空间
- 秘密使用 SD 卡上的空间
将它们保存在应用程序内
- 使应用程序大小膨胀太多
在本地保存应用程序图像的正确方法是什么,以免分散用户的注意力,并且不会在任何地方留下垃圾?
解决方案
您最好的解决方案是使用:
context.getCacheDir()
该目录是应用程序私有的,将在卸载时删除,此外,如果设备空间不足,系统可以为您从该目录中删除。
请注意,文档说:
您不应依靠为您删除这些文件的系统;对于使用缓存文件消耗的空间,您应该始终具有合理的最大值,例如1 MB,并在超过该空间时修剪这些文件
如果您需要大量空间并且更愿意使用 SD 卡,您可以致电
getExternalCacheDir()
反而。这些文件也会在卸载时被删除,但系统不会监控外部存储中的可用空间,因此如果空间不足,不会自动删除这些文件。如果使用此选项,您还应该检查外部存储是否可用
Environment.getExternalStorageState()
在尝试写入之前。
其他提示
您可以在 MediaScanner 中隐藏图像,如果您 把它放在一个隐藏的目录中 (即带有点前缀)例如 /sdcard/.donotscan/
.
更新:作为 romainguy 在推特上提到 如果您放置一个名为的文件,这也适用 .nomedia
进入目录。
我认为最好的方法是使用数据库。
- 它不会炸毁应用程序和内存。
- 一旦应用程序被卸载,相关的数据库就会被删除。
- 除了您的应用程序之外,没有人可以访问此文件。
更新:但;如果你只想缓存数据,webkit 中定义了一个缓存管理器。 缓存管理器
我之前没有使用过该包,但这些方法似乎很容易使用:
static boolean cacheDisabled()
static boolean endCacheTransaction()
static CacheManager.CacheResult getCacheFile(String url, Map<String, String> headers)
static File getCacheFileBaseDir()
static void saveCacheFile(String url, CacheManager.CacheResult cacheRet)
static boolean startCacheTransaction()
你可以在以下位置找到用法 谷歌齿轮代码
我希望这有帮助。
如果您不想使用 CacheManager,则使用数据库或本地(非 SD)文件(本地文件在完全卸载时会被删除)并注册以接收“ACTION_DEVICE_STORAGE_LOW”和“ACTION_DEVICE_STORAGE_OK”广播操作。然后您就会知道您的应用程序何时根据设备占用过多空间以及何时需要开始删除图片。您的应用程序大小仍会增长,但您将能够管理增长和收缩。
只是提示 - 如果您将它们保存在 SD 卡上,它们将被 MediaScanner 扫描并出现在用户的图库(照片)中,这可能是您不想要的。因此,您可能想将它们存储在手机上,或者以某种方式告诉 MediaScanner 不要扫描它们(在快速 Google 搜索后显然不可能。)
可能最好将选定的几个存储在应用程序的私有目录中,卸载应用程序时该目录将被删除。