2010-04-01 59 views
2

我有一个严重基于远程图像的应用程序。它们通常与ListView中的一些数据一起显示。许多这些图像是新的,许多旧图像将不会再被看到。用于清洁SD卡上图像缓存目录的解决方案

我目前将所有这些图像存储在自定义缓存目录(ala evancharlton的magnatune应用程序)中的SD卡上。

我注意到大约10天后,目录总计〜30MB。这比我预期的要多得多,这让我相信我需要提出一个清理旧文件的好方案......我想不出一个好的解决方案。也许你可以帮忙。这些是我的想法:

  1. 删除旧文件。当应用程序启动时,启动后台线程,并删除所有超过X天的文件。这似乎是一个问题,但是,如果用户主动使用应用程序,这可能会导致设备呆滞,如果有数百个文件要删除。

  2. 在SD卡上创建文件后,请致电new File("/path/to/file").deleteOnExit();这将导致所有文件在VM退出时被删除(我甚至不知道此方法是否适用于Android)。这是可以接受的,因为即使需要为会话缓存文件,它们也不需要为下一个会话缓存。看起来如果在虚拟机退出时有很多文件需要删除,这也会降低设备速度。

  3. 删除旧文件,达到最大文件数量。与#1相同,但一次只能删除N个文件。我不太喜欢这个想法,如果用户非常活跃,它可能永远无法赶上并保持缓存目录清洁。

这就是我所拥有的一切。任何建议,将不胜感激。

回答

2
  1. 不要一次全部删除它们。每隔几秒钟删除一个,用户可能不会注意到。
  2. 虚拟机在Android上不能正常退出,因此deleteOnExit()将不可靠。
  3. 参见上面的#1。

您也可以考虑使用AlarmManager安排上午凌晨的删除工作。这有一个额外的好处,即CPU的命中上限 - 任何在后台运行真正的上限为CPU的10%左右,所以即使用户在当时正在使用该设备,这项工作也不会影响用户。在删除东西时,您需要使用WakeLock以使设备保持清醒状态。一种可能性是使用我的WakefulIntentService来解决这个问题,因为它解决了让设备保持清醒状态并让它在主应用程序线程上执行删除操作的问题。

+0

我将使用WakefulIntentService和AlarmManager。好主意 - 谢谢! – synic 2010-04-01 02:23:58