美文网首页RecyclerView精选案例
ListView 中如何实现图片的懒加载

ListView 中如何实现图片的懒加载

作者: 何一涛 | 来源:发表于2016-12-05 02:09 被阅读76次

imhet 译自 stackoverflow

问题描述

我在使用 ListView 显示一组不确定数量的图片和文字。其中图片是从网络中获取,请问有没有一种方式可以实现滚动时图片的懒加载(延迟加载),要求一旦图片下载完毕立即显示到界面上而不会使用界面变得卡顿?

高票答案1

下面是我实现的代码,可以参考下:


public class DrawableManager {
    private final Map<String, Drawable> drawableMap;

    public DrawableManager() {
        drawableMap = new HashMap<String, Drawable>();
    }

    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
}

高票答案2

我写了加载图片的简单例子(放在 github 上),可以参考下。在这个例子中,我使用后台线程来下载图片,图片缓存在 SD 卡和内存中,图片缓存的实现比较简单但足够用,解码图片时我使用了图片的 inSampleSize 属性来减少内存消耗,而且我还处理了 view 的回收。

高票答案3

推荐你使用开源类库 Universal Image Loader。好处很多,自己看项目介绍。

高票答案4

这些开源类库用于加载图片也很给力:

  • Picasso square 出品,必属精品,值得参考
  • Glide android 官方出品,支持链式调用
  • Fresco Facebook 出品,在 Android 4.x 及之前版本中,该类库利用了匿名共享内存技术来节省内存使用

相关文章

  • ListView 中如何实现图片的懒加载

    imhet 译自 stackoverflow 问题描述 我在使用 ListView 显示一组不确定数量的图片和文字...

  • ListView 实现上拉加载

    ListView 实现下拉刷新ListView 实现上拉加载 我们先分析一下如何实现 ListView 上拉加载。...

  • ListView 实现下拉刷新

    ListView 实现下拉刷新ListView 实现上拉加载 我们先分析一下如何实现 ListView 下拉刷新。...

  • 懒加载课堂笔记

    饥人谷_李栋 定义 图片懒加载 阶段实现 如何判断图片在可视范围 代码思路 封装 懒加载抽离 曝光去重 总结 一、...

  • iOS性能优化---tableView懒加载图片

    本文主要介绍一下如何在tableView中实现懒加载图片, 别怪我多嘴, 一些初学者对懒加载的印象可能是这样的: ...

  • 图片懒加载的原理

    懒加载思路及实现 实现懒加载有四个步骤,如下:1.加载loading图片2.判断哪些图片要加载【重点】3.隐形加载...

  • 图片懒加载

    前端实现图片懒加载(lazyload)的两种方式 原生JS实现最简单的图片懒加载 30行Javascript代码实...

  • 懒加载和瀑布流

    一、简述图片懒加载的实现原理 图片懒加载 若一开始,页面上有许多的图片要加载,而如果同时加载这么多图片,会消耗性能...

  • 如何实现图片懒加载,预加载!!

    提到前端性能优化中图片资源的优化,懒加载和预加载就不能不说,下面我用最简洁明了的语言说明懒加载和预加载的核心要点以...

  • 前端如何实现图片懒加载(lazyload) 提高用户体验

    来源:前端如何实现图片懒加载(lazyload) 提高用户体验 原文地址:http://i.jakeyu.top/...

网友评论

    本文标题:ListView 中如何实现图片的懒加载

    本文链接:https://www.haomeiwen.com/subject/cyrkmttx.html