加载网络图片
来源:互联网 发布:防身器材 淘宝 编辑:程序博客网 时间:2024/06/04 01:19
最近了解了一下网络加载图片,很想感谢一下我学习的博客地址,没找到地址。
原理是这样的:
1.先把图片的url和ImageView放到WeakHashMap中,然后再让WeakHashMap支持多数据同步。
2.先从自己生成的内存缓存类(MemoryCache)中查找图片,缓存查找图片较快。
此类是存图片用的:MemoryCache使用了弱引用,内存不够时自动清理
3.如果缓存不为空,直接让ImageView显示图片
如果缓存为空,开启新线程加载图片
1).生成一个任务队列:PhotoToLoad(将参数传进任务队列)
2).生成一个线程池加载图片。加载图片时使用线程。
3).在PhotosLoader中把任务队列得到,
4).线程开始执行:获取图片:a.根据url创建缓存图片的文件 b.先从文件缓存中查找是否有图片,最后从指定的url中下载图片
如果没有拿到url的图片,使用本地资源图片。
如果拿到url的图片,把图片放到MemoryCache中。
然后在UI线程中更新界面
这是借鉴Demo:
http://download.csdn.net/detail/u012123938/9486634
我和他不一样的地方是MemoryCache(文件缓存类)我只用了软引用,而他用的是LruCache
//内存缓存,使用软引用,内存不够时自动清理public class MemoryCache { //SoftReference如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。 private Map<String, SoftReference<Bitmap>> cache = Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());//软引用 public Bitmap get(String id) { if (!cache.containsKey(id))//如果cache中的key不存在,返回空 return null; SoftReference<Bitmap> ref = cache.get(id); return ref.get(); } public void put(String id, Bitmap bitmap) { cache.put(id, new SoftReference<Bitmap>(bitmap)); } public void clear() { cache.clear(); }}
这是他的:
public class MemoryCache {
private static final String TAG = "MemoryCache";
/**
* 放入缓存时是个同步操作
LinkedHashMap构造方法的最后一个参数true代表这个map里的元素将按照最近使用次数由少到多排列,即LRU
这样的好处是如果要将缓存中的元素替换,则先遍历出最近最少使用的元素来替换以提高效率
*/
private Map<String, Bitmap> cache=Collections.synchronizedMap(
new LinkedHashMap<String, Bitmap>(10,1.5f,true));//Last argument true for LRU ordering
/**
* 缓存中图片所占用的字节,初始0,将通过此变量严格控制缓存所占用的堆内存
*/
private long size=0;//current allocated size
/**
* 缓存只能占用的最大堆内存
*/
private long limit=1000000;//max memory in bytes
public MemoryCache(){
//use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory()/4);
}
public void setLimit(long new_limit){
limit=new_limit;
Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB");
}
public Bitmap get(String id){
try{
if(!cache.containsKey(id))
return null;
//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
return cache.get(id);
}catch(NullPointerException ex){
ex.printStackTrace();
return null;
}
}
public void put(String id, Bitmap bitmap){
try{
if(cache.containsKey(id))
size-=getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size+=getSizeInBytes(bitmap);
checkSize();
}catch(Throwable th){
th.printStackTrace();
}
}
/**
* 严格控制堆内存,如果超过将首先替换最近最少使用的那个图片缓存
*/
private void checkSize() {
Log.i(TAG, "cache size="+size+" length="+cache.size());
if(size>limit){
/**
* 先遍历最近最少使用的元素
*
*/
//least recently accessed item will be the first one iterated
Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();
while(iter.hasNext()){
Entry<String, Bitmap> entry=iter.next();
size-=getSizeInBytes(entry.getValue());
iter.remove();
if(size<=limit)
break;
}
Log.i(TAG, "Clean cache. New size "+cache.size());
}
}
public void clear() {
try{
//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
cache.clear();
size=0;
}catch(NullPointerException ex){
ex.printStackTrace();
}
}
/**
* 图片占用的内存
*/
long getSizeInBytes(Bitmap bitmap) {
if(bitmap==null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}
- Delphi加载网络图片
- android加载网络图片
- 网络加载图片
- 加载网络图片
- 异步加载网络图片
- SDWebImage 加载网络图片
- 网络图片异步加载
- 异步加载网络图片
- Android加载网络图片
- android加载网络图片
- android 网络加载图片
- 异步加载网络图片
- 网络加载图片
- Flex加载网络图片
- swift 加载网络图片
- 网络加载图片
- ImageView加载网络图片
- 加载显示网络图片
- whu1608 Calculation
- 深度理解现代浏览器中的BFC和IE下的haslayout
- Eclipse中maven项目没法自动编译、编译失败、WEB-INF/classes目录中没有Class文件
- 当EditText的Gravity设置为right时, 如何让光标出现在Hint内容的右边
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- 加载网络图片
- NYOJ:题目113 字符串替换
- Spark - 导入JSON、Text文件为Dataframe 做SQL查询
- IntelliJ IDEA设置系列(三):类和方法的快捷方式
- 2015年腾讯移动应用质量大数据报告
- 设计模式-行为模式
- 接口和抽象类的区别是什么
- Eclipse中maven项目没法自动编译、编译失败、WEB-INF/classes目录中没有Class文件
- 理解webservice SOAP WSDL