我的应用程序使用了很多从互联网上下载并在Android手机上本地缓存的图片。我想知道,保存这些图片的正确方法是什么。我看到有几种方式,但并不完全令人满意。
将它们保存在公共文件夹中的SD卡上
将它们保存在非公用文件夹中的SD卡上
将它们保存在应用程序中
本地保存应用程序图像的正确方法是什么,以免分散用户的注意力并且不留垃圾?
答案 0 :(得分:31)
您最好的解决方案是使用:
context.getCacheDir()
此目录是应用程序专用的,在卸载时将被删除,此外,如果设备空间不足,系统可以从此目录中删除。
注意虽然文档说:
你不应该依赖系统 为您删除这些文件;您 应该总是合理的 金额的最大值,例如1 MB 您使用缓存文件占用的空间, 超过时修剪这些文件 那个空间
如果您需要大量空间而宁愿使用SD卡,也可以致电
getExternalCacheDir()
代替。这些也将在卸载时删除,但系统不会监视外部存储中的可用空间,因此如果空间不足则不会自动删除这些文件。如果使用此选项,您还应检查外部存储是否可用
Environment.getExternalStorageState()
在尝试写入之前。
答案 1 :(得分:11)
如果put it in a hidden dir(例如带有前缀的点)(例如/sdcard/.donotscan/
),您可以隐藏MediaScanner中的图像。
更新:作为romainguy mentions on twitter,如果您将名为.nomedia
的文件放入目录中,这也可以。
答案 2 :(得分:6)
我认为最好的方法是使用数据库。
更新:但是;如果要仅缓存数据,则在webkit中定义缓存管理器。 CacheManager
之前我没有使用过该软件包,但这些方法似乎很容易使用:
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()
找到该用法
我希望这会有所帮助。
答案 3 :(得分:0)
如果您不想使用CacheManager,则使用数据库或本地(非SD)文件(本地文件在完全卸载时删除)并注册以接收'ACTION_DEVICE_STORAGE_LOW'和'ACTION_DEVICE_STORAGE_OK'广播动作。然后,您将知道应用程序何时根据设备占用太多空间以及何时需要开始删除图片。您的应用程序规模仍将增长,但您将能够控制增长和缩减。
答案 4 :(得分:-1)
只是提示 - 如果您将它们保存在SD卡上,它们将被MediaScanner扫描并显示在您可能不想要的用户的图库(照片)中。因此,您可能希望将它们存储在手机上,或以某种方式告诉MediaScanner不要扫描它们(在快速Google搜索后显然不可能。)
可能最好将少数几个存储在应用程序的私有目录中,在卸载应用程序时将删除它们。