java - Android LRU 缓存未显示正确的位图?

标签 java android asynchronous android-listview android-lru-cache

我正在制作一个 Android 应用程序,其中有带有缩略图的新闻文章。这些缩略图从网络加载并存储在 LruCache 中,其中 URL 作为键,位图作为值。

private LruCache<String, Bitmap> tCache;

在适配器的 getView() 方法中,我调用 getThumbnail() 来检查缓存(必要时从网络加载),然后显示缩略图。

public void populateList(){
    ...
    new Thread(new Runnable() {
        @Override
        public void run() {
            getThumbnail(story, thumbnail);
        }
    }).start();
}

private Bitmap getThumbnail(Story story, ImageView imageView) {
    String url = story.getThumbnail();

    Bitmap bitmap;
    synchronized (tCache) {
        bitmap = tCache.get(url);

        if (bitmap == null) {

            bitmap = new ImageLoadingUtils(this, imageView).execute(url,
                    Boolean.TRUE).get();
            tCache.put(url, bitmap);

        }
    }
    return bitmap;

}

ImageLoadingUtils 从网络加载,完成后将生成的位图放入 ImageView 中。

@Override
protected void onPostExecute(Bitmap result) {
    if (imageView != null) {
        imageView.setImageBitmap(result);
        adapter.notifyDataSetChanged();
    }
}

问题是当我向下滚动时,缩略图会在同一个 ListView 中重复。

________
|IMAGE1|
|IMAGE2|
|IMAGE3|  SCREEN
|IMAGE4|
--------
|IMAGE1|
|IMAGE2|  OFFSCREEN
________

当我向下滚动然后向上滚动时,文章不再有正确的缩略图。太乱了。

有人能发现问题吗?非常感谢。

最佳答案

问题是因为 View 在 ListView 中被重用。这是一个关于如何在 ListView 中异步缓存和加载缩略图的好例子。

Lazy Load ListView Android

关于java - Android LRU 缓存未显示正确的位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091939/

相关文章:

android - 删除 RecyclerView 中 CardView 之间的多余空格

javascript - AngularJS $http 结果与 promise

java - Kafka 流处理器线程安全吗?

java - RuntimeException : Unable to start activity ComponentInfo{}: java. lang.NullPointerException。安卓

java - 如何获取某个月份的所有日期

node.js - 在运行测试之前, Mocha 似乎不会等待 promise 链完成

multithreading - 如何在nodejs中创建线程

Java HTML 渲染 "pt"与 "px"大小

java - TreeSet<Entry<Character, Long> 使用比较器排序问题

java - 在 finally block 中将对象引用设置为 null