0

我正在从服务器下载图像ListView并将其存储到 SD 卡中。

并且当下次列表视图出现时,我仅使用异步方法从 SD 卡访问它,我使用此方法,以便用户不需要访问服务器。

但是,当所有图像都从 SD 卡加载到 listview 中时,如果我滚动它的速度非常快,那么每次它尝试仅从 SD 卡访问它而不是从缓存中访问我猜。

从服务器下载图像时我也遇到了同样的问题,这就是为什么我想将它存储到 SD 卡中。但我面临同样的问题。

这是我的代码ListImageDownloader。在那里有一个函数被调用downloadBitmap(String),我创建了另一个名为的函数downloadSDBitmap(String),其代码如下

Bitmap downloadSDBitmap(String urlId) {

         Bitmap bitmap = null;
         File file = new File( 
                 fileLoc +"/"+ urlId+".png");

         if(file.exists()){
             Log.d("PATH" , file.getAbsolutePath());

             bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
         }

         return bitmap;

}

除此之外,整个缓存代码都是一样的。所以任何人都可以帮助我如何改进它,Gtalk当我快速滚动时它只加载一次图像,如果我快速滚动图像保持原样并且不从网络获取

更新

这些是我的参数

final static int MAX_ENTRIES = 150;

private static final int HARD_CACHE_CAPACITY =50;
private static final int DELAY_BEFORE_PURGE = 10 * 1000; // in milliseconds
4

1 回答 1

1

缓存从根本上依赖于可用内存。如果您的应用程序有剩余内存,您将需要实现一个很好的解决方案来缓存您的位图。

过去是SoftReference/WeakReference一种流行的缓存位图的方法(我在一年前尝试过,你可以在这里阅读我的问题)。但在 Android 的后期 API 中,垃圾收集器变得更加积极地收集它们,因此不再推荐使用它们。

现在推荐使用LRU 缓存Android 开发者网站上有一个示例。

于 2012-08-21T20:09:05.710 回答