在缓存图像和数据时,您应该使用内部存储还是外部存储?

net*_*ein 9 java storage android android-sdcard

在内部/外部存储中读过这个Android保存应用程序设置/数据,但我不认为我真的得到了答案.

我正在开发一个应用程序,我应该存储一些"缓存"数据,如十几个图像和一些字符串(json).

最初我将所有这些存储在SD卡上(外部存储)但后来我认为这可能会被SDCard弃用在最近的设备中弃用.

读了一下之后,我明白外部存储不仅仅是SD卡,而是"可移动存储介质(如SD卡)或内部(不可移动)存储",所以不应该弃用但是......它是共享的空间,并没有存储在那里的文件的所有权,所以第一个问题是我删除应用程序时无法删除它们.

所以我改为内部存储,以避免文件/图像"公开",并在删除应用程序后删除它们.

这是推荐的方法吗?

对于内存较低但SD卡空间较大的设备,这是一种很好的方法吗?

我的应用程序支持从1.6到4.0(到目前为止)所以我有很多遗留设备......我必须让应用程序正常工作(好).

期待一些有趣的答案!

rog*_*oom 5

这取决于您要存储的数据类型。

你提到它是缓存的数据,所以我的假设是,如果由于某种原因它全部消失了,这应该无关紧要。这让我相信你应该使用getCacheDir(). 在这种情况下,如果缓存变得太大,系统将删除文件,因此内部存储空间较低的设备应该不会出现问题(尽管建议您自行管理),它相对安全,并且将由应用程序管理所以如果有卸载,它将被删除。

getExternalCacheDir()是在 2.2 中引入的,因此对您没有任何用处,除非您想检测版本并在 2 个缓存目录之间切换getExternalCacheDir()不提供安全性,因此无论如何都可以通过访问 SD 卡来访问数据。我认为您可能想要这样做的唯一原因是您想要的缓存大小,但从您的描述来看,数据似乎并不多。

从评论更新:

虽然这是缓存的特定情况……但我不希望它在系统需要时被删除。这是我需要应用程序决定何时清除的那种缓存。存储在“普通”内部存储而不存储在缓存目录中的主要问题是什么?

如果您到达系统正在清理内部缓存数据的阶段,因为存储空间太低,那么您可能应该让它清理此类应用程序数据。通过使用标准的内部数据存储,您可以绕过这种安全保护措施,这可能会比删除应用程序数据产生更多令人不快的问题。

如果您的数据非常重要,那么我建议尝试识别更重要的特定数据并单独管理。如果您确定的这些数据需要安全,那么使用文件或数据库(取决于数据类型)的内部存储似乎是您唯一真正的选择,但您必须警惕这些数据的建立。

从评论更新

您如何看待使用 SharedPreferences 保存字符串数据?SharedPreference 字符串保存的大小是否有限制?这是一个(好)的可能性吗?

过去,我使用共享首选项来存储相对较大的 json 字符串没有问题,我发现这比将数据库用于要保存的值有限的原始数据类型(和字符串)更简单。但是,当您拥有图像或大量值时,管理会变得更加复杂。此外,在存储空间方面,您将遇到与标准内部存储相同的问题。