快速滚动网格视图时如何防止图像多次加载?

时间:2014-12-17 13:35:47

标签: android gridview concurrency scroll lazy-loading

我有一张带有sdcard缩略图的gridview。我使用asynctask来延迟加载图像。当我慢慢滚动时,它工作得很完美,但是当我滚动太快时,不同的图像多次加载到同一网格项目上,最后加载正确的图像需要6 7秒。我试图通过使用getFirstVisiblePosition和getLastVisiblePosition检查视图的位置是否可见,这次一些图像从未加载。

1 个答案:

答案 0 :(得分:3)

您是否尝试缓存图片?以LruCache为例。 这是文档: http://developer.android.com/reference/android/util/LruCache.html

这里是官方教程 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

快速使用它:

LruCache<String, Bitmap> mMemoryCache;
public void onCreate(Bundle b)
{
 .....
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

final int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in kilobytes rather than
            // number of items.
            return bitmap.getByteCount() / 1024;
        }
    };
....
}
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}
public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

编辑: 如果您以异步方式加载图像,则必须查看本教程: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

它向您展示了如何处理并发并取消当前任务(如果正在运行)