当我们的ListView中的Item包含图片,而且这些图片是同一资源,我们用多线程去加载图片,这时候可能就发生了这种情况。

比如线程是人,第一个人去做加载图片到缓存的工作,还没做好时第二个人要这同一张张图,结果缓存还没有这张图,于是第二个人也去加载图片到缓存。。以此类推,同时可能有N个人在加载同一张图,N取决于图片没加载到缓存前,可见的Item数量。

于是针对这种情况进行细化同步,避免发生。

//首先需要一个ConcurrentHashMap<String, Boolean>,String表示资源地址如图片地址,Boolean表示是否有线程正在加载。
//之所以用ConcurrentHashMap,是因为它不但是同步的而且效率高于Synchronized和ReenTrantLock.
private ConcurrentHashMap<String, Boolean> mConcurentMap;
//然后需要一个ReentrantLock锁住线程内的关键判断语句。
private ReentrantLock mLock;

当一个线程没有在缓存找到资源,那么将读取资源,ConcurrentHashMap记录这个资源地址,并且Boolean为true,表示有人在干这个活了,下面的人只要等待干活的人干完就行了。

//这是加载图片的线程,当缓存中没找到图片(mBitmapCache.get(path) == null)进入此线程
Thread thread = new Thread() {@Overridepublic void run() {mLock.lock();//锁住关键判断逻辑,避免同一资源多个线程都进入false逻辑(加载图片)if (mConcurentMap.get(path) == false) {// mConcurentMap添加键值对,表示path这个资源已经有人在加载了mConcurentMap.put(path, true);mLock.unlock(); //释放锁,下面进入的线程只能进入true的逻辑(等待第一个人做完工作)if (path != null && (!path.equals("null"))                                                        && (!"".equals(path))) {//加载图片item.bm = PictureHelper.getCropImage(path, 400, true, 100,mActivity, 7, true);//图片加载完放入缓存Lrucache
                   mBitmapCache.put(path, item.bm);//设置键值对,false表示path这个资源已经加载完,或者没人加载了mConcurentMap.put(path, false);} else {item.bm = null;//图片地址无效mConcurentMap.put(path, false);}Message msg = new Message();msg.what = 1;handler.sendMessage(msg); } else {// 释放锁
                mLock.unlock();// 表示有人在加载图片,因此用死循环等待加载完成while (true) {// false表示加载完成,此时缓存已有图片,应该跳出循环if (mConcurentMap.get(path) == false) {// Logg.D("other need break cycle");break;}}// Logg.D("other go out cycle");if (mBitmapCache.get(path) != null) {item.bm = mBitmapCache.get(path);Message msg = new Message();msg.what = 2;handler.sendMessage(msg);} else {throw new NullPointerException("(mBitmapCache.get(path) == null!");}}}};executors.execute(thread);

Android ListView避免多线程加载一个同一资源相关推荐

  1. android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片

    Android Listview异步动态加载网络图片 详见: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html 标签: Android SDK ...

  2. android listview数据动态加载_Android | Tangram动态页面之路(六)数据分离

    经过前五篇系列文章,对Tangram和vlayout也有了初步认识,这篇文章开始将结合业务场景使用,探索框架能力能对业务带来的支持,因为调研本身是一个需要不断踩坑的过程,所以大纲也做了微调,后续会根据 ...

  3. qt android webview,qt browser 加载一个webview过程

    webkit.org 中有一篇文章讲述how to load frame,下面结合qt的demobrowser来讲述一下这个过程. 第一个流程: browser.exe 启动后默认加载的homepag ...

  4. android利用多线程加载图片【不使用第三方库】

    前言 这是一份关于android利用线程池加载图片的demo.有部分参考意义. 代码 <?xml version="1.0" encoding="utf-8&quo ...

  5. Android 进阶:网络图片加载 - Glide篇

    概述: Glide官网 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资 ...

  6. Android中的图片加载

    Android中的图片加载所出现的问题 在Android的开发中,经常需要去加载图片,但是图片的尺寸有时候往往会很大,而我们的内存是有限的,加载进来的时候很有可能会造成内存溢出,这种结果也是我们不想看 ...

  7. Android 之Loader(加载器)

    介绍 Android 3.0 中引入了加载器,支持轻松在 Activity 或片段中异步加载数据. 加载器具有以下特征: 可用于每个 Activity 和 Fragment. 支持异步加载数据. 监控 ...

  8. ListView上拉加载和下拉刷新多种实现方式

    ListView上拉加载和下拉刷新多种实现方式 该篇为ListView下拉刷新和上拉加载实现的各种方法大合集.可能在具体的细节逻辑上处理不太到位,但基本上完成逻辑的实现.细节方面,个人可以根据自己的需 ...

  9. android动态设置错误页面,Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...

最新文章

  1. 脑电分析系列[MNE-Python-8]| 参考电极简介
  2. Intellij IDEA SpringBoot项目热部署解决方案
  3. 广西中专机器人应用与维护_我校2018级工业机器人应用与维护专业跟岗实习
  4. 实用的编程网站—良好的开端
  5. 3G应用上新闻联播 TD-SCDMA被内定?
  6. 微信小程序uni.getImageInfo踩坑大计划
  7. 实体类在set字段时报空指针异常
  8. 一个mapper接口有多个mapper.xml 文件_MyBatis 源码解析:映射文件的加载与解析(上)
  9. vector性能调优之resize与reserve
  10. powerdesigner数据字典导出模板设置
  11. 解决fortify扫描出的Path Manipulation问题(java语言)
  12. 磁盘管理看不到硬盘的恢复办法
  13. NB-IoT和GSM概述
  14. 3dsmax展uv_3dsmax展uv是啥玩意
  15. 小白DIY自己的系统镜像
  16. UML用例图-软件需求分析与设计(很详细,很详细,很详细)
  17. 网易有道一面9.16(45min)
  18. Jfinal学习(一)
  19. Python环境下使用MATLAB
  20. 手写Java动态代理

热门文章

  1. Laravel日志查看器 -- log-viewer扩展
  2. MUI主界面菜单同时移动主体部分不出滚动条解决
  3. jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
  4. classpath: spring 中的查找方式
  5. android基础组件----Button的使用
  6. NSString 练习
  7. weblogic数据源配置的问题,weblogic密码破解
  8. SQL登录 18470 18452 错误
  9. Node — 第六天(前后端分离)及(身份验证)
  10. python文件操作总结