为什么在Android上要使用getCacheDir()函数

21

当系统内存不足时,Android 可能会自动删除 CacheDir 中的文件。但文档表示我们不应该依赖于系统清理此缓存,因此需要编写额外的代码进行轮询和删除。

如果是这种情况,为什么要选择 getCacheDir() 而不是 getFilesDir()?两者都在内存中,后者在清理内容和时间方面为开发人员提供了更多的控制权。

谢谢!


4
因为您可以在系统设置 > 应用程序中使用“清除缓存”按钮。 - zapl
另一个原因是,如果您不需要持久化其他任何内容,它也不需要用户的任何权限。 - user2058839
2个回答

52
Android系统可能会在内存不足时自动删除CacheDir中的文件。第三方应用程序也可以从应用程序的缓存目录中删除文件。正如zapl所指出的,用户可以从设置中手动清除应用程序的缓存。但是文档中指出我们不应该依赖系统来清理这个缓存,因此需要编写额外的代码进行轮询和删除。之所以选择getCacheDir()而不选择getFileDir()是因为操作系统、第三方应用程序和用户都可以清除缓存。然而,仅仅因为这些事情“可以”清除缓存,并不意味着它们会自动清除缓存,因此您需要定期自己整理缓存。同样,虽然母亲“可以”打扫你的房间,但如果你不想被扫帚打击,最好自己打扫房间。关于后面提到的开发者可以更多地控制清理什么和何时清理这一点,两者是等价的,即getCacheDir()返回一个File对象,getFilesDir()也返回一个File对象。

2
@raul8 他们都返回一个File对象,因此OP似乎误认为getFilesDir()“为开发人员提供了更多的功能”。它们都提供相同的功能。 - Erik Sandberg
8
加一分对于“母亲能够打扫你的房间”的比喻。 - Super-intelligent Shade
2
@anshsachdeva:缓存的目的是为了被清除。如果您不想清除缓存,那就不是缓存。理想情况下,您应该让缓存被任何可能的触发器清除,包括在设置中的用户操作。如果由于某种原因这是不适当的,那么就不要使用Android的缓存选项('getCacheDir()', 'getExternalCacheDir()'),因为从操作系统的角度来看,你想要的并不是一个缓存。 - CommonsWare
1
@anshsachdeva:“如果我播放10个 YouTube 视频,每个视频都播放10次,在此期间关闭/重新打开应用程序,它们都将被缓存而不是下载,对吧?”——我无法对 YouTube 的实现进行评论。然而,由于 DRM 等因素,细节可能比人们想象的要复杂。“我认为我的缓存定义将是一个存储了来自各种观看视频的 250 MB 网络数据的库,只有当我在已满的缓存中添加新的视频缓存时,才会清除它”——你为什么要阻止用户清除那个缓存? - CommonsWare
1
@anshsachdeva:“但是我不想被像任务管理器这样的缓存清理服务发现”--为什么?如果用户选择了某种缓存管理器,那就是用户的选择。对于一些低端手机用户来说,250MB并不是微不足道的存储空间。“或者设备重启”--缓存文件可以在重启后保留,至少在我测试过的设备上是这样的。“用户仍然可以通过进入系统应用程序设置来清除其所有应用程序内存”--这会删除所有内容:SQLite,SharedPreferences等。 - CommonsWare
显示剩余5条评论

3

getCacheDir() 返回缓存文件的路径,而 getFilesDir() 返回应用程序内部存储创建和存储的文件的路径。内部存储是持久性的:系统无法删除它。


这就是问题所在。那么,为什么我不应该使用getFilesDir()来进行缓存呢?getCacheDir()又是如何帮助我的呢? - dev
1
我理解你的观点。我明白这是一个方便的缓存存储位置,您可以在其中应用逻辑,而不会因为它与持久性存储分离而有任何混乱的风险。 - znat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接