RecyclerView异步加载图片

如何在不使用第三方图片加载框架的基础上实现RecyclerView和ListView的中实现异步加载图片功能?
简单的方法是我们可以使用LruCache+AsyncTask结合的方式实现。大致思路是在onBindViewHolder()方法中根据key去内存缓存中对应的bitmap,如果找到了就直接显示,如果没有找到就开启一个异步任务去下载这个bitmap,下载完成后存进内存缓存中并执行相应的回调进行展示。

1.首先是LruCache的工具类,我们可以这样写:

private static final class CacheHelper{private static LruCache<String, Bitmap> sLruCache;static {sLruCache = new LruCache<String, Bitmap> ((int)Runtime.getRuntime ().maxMemory ()/4){@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getByteCount ();}};}}

2.然后是下载图片的异步任务,我们可以这样写:

private static final class ImageTask extends AsyncTask<String, Void, Bitmap> {private Listener mListener;ImageTask(Listener listener) {mListener = listener;}@Overrideprotected Bitmap doInBackground(String... strings) {Bitmap bitmap = getBitmap (strings[0]);CacheHelper.sLruCache.put (strings[1], bitmap);return bitmap;}@Overrideprotected void onPostExecute(Bitmap bitmap) {mListener.onSuccess (bitmap);}public interface Listener{void onSuccess(Bitmap bitmap);}private static Bitmap getBitmap(String url){Bitmap bitmap = null;BufferedInputStream stream = null;URL url1 = null;try {url1 = new URL (url);URLConnection connection = url1.openConnection ();stream = new BufferedInputStream(connection.getInputStream ());bitmap = BitmapFactory.decodeStream (stream);} catch (MalformedURLException e) {e.printStackTrace ();} catch (IOException e) {e.printStackTrace ();}finally {if (stream != null) {try {stream.close ();} catch (IOException e) {e.printStackTrace ();}}}return bitmap;}}

3.在onBindViewHolder()方法中,展示图片前从缓存中拿,如果没有的话就开启一个异步任务,并指定回调。

 @Overridepublic void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {Bitmap bitmap = CacheHelper.sLruCache.get ("ChatRecyclerAdapter" + i);if (bitmap == null) {new ImageTask (new ImageTask.Listener () {@Overridepublic void onSuccess(Bitmap bitmap) {viewHolder.mHead.setImageBitmap (bitmap);}}).execute (chatBean.getImageUrl (), "ChatRecyclerAdapter" + i);}else {viewHolder.mHead.setImageBitmap (bitmap);}}

这样就可以在不依赖第三方框架的情况下实现RecyclerView和ListView的中图片的异步加载。
这里只是一个简单思路,具体使用时候需要考虑RecyclerView和ListView的细节问题。比如在条目不可见时异步任务加载完毕后就不需要在回调显示了,这个可以通过让异步任务持有一个当前RecyclerView或ListView的实例,在onBindViewHolder()方法中给ImageView设置tag,然后通过这个tag找到条目的ImageView,如果为空说明已经不再屏幕中,这样我们就不需要执行显示的回调了。

RecyclerView异步加载图片相关推荐

  1. Android实现ListView异步加载图片

    转: http://www.iteye.com/topic/685986 ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法 ...

  2. 模仿SDWebImage实现异步加载图片

    模仿SDWebImage实现异步加载图片 SDWebImage想必大家都不陌生吧,要实现它的图片异步加载功能这个还是很简单的. 注意:此处我只实现了异步加载图片,并没有将文件缓存到本地的打算哦:) 源 ...

  3. LruCache缓存处理及异步加载图片类的封装

    Android中的缓存处理及异步加载图片类的封装   一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端 ...

  4. android开发小技巧:实现listview异步加载图片

    2019独角兽企业重金招聘Python工程师标准>>> 针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师 ...

  5. [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...

  6. Android 开发笔记 ListView异步加载图片

    当ListView需要在线获取数据,并且列表中需要显示图片时,友好的处理方式是使用异步加载图片的方式. 这是因为LIstView中显示的内容是分为两部加载的,第一次加载文本信息(包含图片的uri地址) ...

  7. Android ListView异步加载图片乱序问题,原因分析及解决方案

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是 ...

  8. IOS中UITableView异步加载图片的实现

    本文转载至 http://blog.csdn.net/enuola/article/details/8639404  最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...

  9. android grideview 图片png透明,Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题...

    众所周知,我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application ...

  10. Android之使用Android-AQuery异步加载图片(一)

    第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...

最新文章

  1. 彻底解决兼容问题 Windows 7 安装 Visual C++ 6.0 (VC6) 全程图解
  2. Kendo Web UI Grid数据绑定,删除,编辑,并把默认英文改成中文
  3. 《Photoshop Lab修色圣典(修订版)》—第1课深入讨论
  4. php上传图片到远程服务器并返回图片地址到本地显示
  5. tableau无法建立连接_欧普照明利用 Tableau 解放数字化人才,助力企业数字化转型...
  6. 计算机基础类报刊,全国“xx杯”计算机应用基础类说课大赛优秀作品:图文表混排-制作感恩报刊说课课件...
  7. jq 点击事件 调用
  8. 线报天下免费补丁,使用补丁可解锁全部线报
  9. Linux内核4.14版本——alsa框架分析(3)-PCM设备的创建
  10. mysql 按照年龄段分组查询
  11. Android获取天气预报Demo
  12. HTML5和CSS3新特性(完整版)
  13. 使用Pandas处理美国人口数据
  14. 2020最新尚硅谷- 大数据课程
  15. 医院疫情管理系统-数据库课程设计(源码+数据库+报告全套)
  16. 【MySQL】查询语句
  17. (c语言)兔子繁衍问题
  18. kettle_Day4_Hop的作用
  19. Linux各个版本介绍
  20. .* 与* 和./与/

热门文章

  1. 计算机专业考注册测绘师经验,注册测绘师考试攻略
  2. python 对象是什么概念
  3. Arduino U8glib库中的中文字体
  4. MacOS Ventura 13.0 Beta4 (22A5311f) 带 OC 0.8.3 / Cl 5148 / PE 三分区原版黑苹果镜像
  5. FPGrowth算法理论
  6. Win10下安装Intel Visual Fortran2019具体步骤及初始调试过程。
  7. css系统自带字体_CSS系统字体
  8. 使用Logisim软件实现一位全加器,四位串行加法器,四位并行加法器。
  9. 逐梦旅程:Windows游戏编程之从零开始 读后感
  10. window下的批处理命令学习