【问题标题】:How to prevent images loading multiple times when fast scrolling a gridview?快速滚动gridview时如何防止图像多次加载?
【发布时间】:2014-12-17 13:35:46
【问题描述】:

我有一个带有 sdcard 缩略图的 gridview。我使用异步任务来延迟加载图像。当我缓慢滚动时它工作得很好但是当我滚动太快时,不同的图像多次加载到同一个网格项上,最终加载正确的图像需要 6 7 秒。我尝试使用 getFirstVisiblePosition 和 getLastVisiblePosition 检查视图的位置是否可见,而这一次某些图像永远不会加载。

【问题讨论】:

标签: android gridview concurrency scroll lazy-loading


【解决方案1】:

您是否尝试缓存您的图像?以 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

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

【讨论】:

  • 如果我理解您的问题是您的图像在滚动时被多次加载,使用缓存您只需要使用缓存的图像,或者如果尚未缓存则加载一次。
  • 我的问题是,当快速滚动gridview时,多个asyntask启动,当滚动完成时,那些不同的asyntask将不同的图像加载到同一个imageview中,因为gridview多次使用相同的视图。因此,每个可见的 imageview 在 6 7 秒内加载 7-8 个不同的图像,直到最后一个 asyntask 完成并加载正确的图像!
  • 何我明白看到我的编辑我使用这种方法,它工作得很好。只需要按照教程步骤:)
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2012-08-22
  • 2013-09-12
  • 2021-03-15
相关资源
最近更新 更多