Android中图片的异步加载
转:
1、 为什么要异步加载图片
下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验
2、 SoftReference的作用
栈内存—引用
堆内存—对象
Eg:
Object obj = new Object();
Obj = null;
当垃圾收集器启动时,会回收对象;
当一个对象没有任何引用指向,就会被回收。
SoftReference<Object>sr = new SoftReference<Object>(new Obnject());
引用是软引用,当垃圾回收器启动时,系统会判断内存是否充足,内存不足时,即使对象有引用指向,也会被回收。
Object obj = sr.get();获取软引用指向的对象,当已被回收时,返回NULL。
在这里我们使用SoftReference对象来建立图片缓存
3、 异步加载图片的方法
基本流程:
A、 获取图片URL
B、 根据URL查询缓存
Eg:假如取回了20条微博,其中5条微博是同一个人发的,这样这个人的头像就要被取回5次,这是不合理的。
解决方法:把从网络上下载的图片以键值对的方式放到缓存里,键是URL,值是下载的图片,下次再去读取图片时,先看URL是否在缓存里,如果在,就不用下载了。
C、 访问缓存or访问网络
D、 得到图片对象
E、 显示图片
代码示例:
/**
* 实现图片的异步加载
* @author Zhu
*
*/
public class AsyncImageLoader {
//图片缓存对象,键是URL,值是SoftReference对象,该对象指向一个Drawable对象
private Map<String,SoftReference<Drawable>> imageCache =
new HashMap<String,SoftReference<Drawable>>();
/**
* 实现图片的异步加载
* @param imageUrl
* @return
*/
public Drawable loadDrawable(final String imageUrl){
//查询缓存,查看当前要下载的图片是否已经在缓存中
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
if(softReference.get()!=null){
return softReference.get();//还没被回收
}
}
final Handler handler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//Handler是与主程序处于同一线程的,在这里可以写加载完图片的处理,显示or存储or...
} };
//新开辟一个线程
new Thread(){ @Override
public void run() {
// TODO Auto-generated method stub
super.run();
Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl,new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0,drawable);
handler.sendMessage(message);
} }.start();
return null;
}
/**
* 根据图片的URL从网络上下载图片
* @param imageUrl
* @return
*/
public Drawable loadImageFromUrl(String imageUrl){
try{
//根据图片的URL,下载图片,并生成一个Drawable对象
return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
//另一种下载图片的方法:
// Drawable icon;
// HttpURLConnection hc=(HttpURLConnection)new URL(imageUrl).openConnection();
// icon=new Drawable(hc.getInputStream());
// hc.disconnect();
}catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
}
Android中图片的异步加载的更多相关文章
- Android引入高速缓存的异步加载全分辨率
Android引进高速缓存的异步加载全分辨率 为什么要缓存 通过图像缩放,我们这样做是对的异步加载优化的大图,但现在的App这不仅是一款高清大图.图.动不动就是图文混排.以图代文,假设这些图片都载入到 ...
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...
- Android之使用Android-AQuery异步加载图片(一)
第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...
- 【jar包】图片的异步加载--【 Imageloader】
Android Imageloader图片异步加载 Imageloader是一个在android平台下简单的下载.显示.缓存空间的图片加载库. 异步下载网络图片并可以在UI线程更新View,使用二级缓 ...
- BitmapImage处理网络图片,例如阿里云获取的图片。异步加载到需要显示的控件上。提升速度非常明显。
想直接把网络图片赋给控件,又要下载又要缓存,速度非常慢.不流畅. 需要进行处理,异步加载会显著提升速度.方法如下: public static BitmapImage ByteArrayToBitma ...
- vue-awesome-swiper中的数据异步加载
<template> <div> //第一个轮播 加了v-if 判断,可以实现 loop 轮循 <swiper v-if="gglist.length>1 ...
- 移动设备的HTML页面中图片实现滚动加载
如今移动互联网风靡全球,移动页面的元素也是丰富多彩,一个移动页面的图片超过10张已经是再正常不过的事情了.但是相对,很多移动用户还停留在2G,3G这样的网络中.那么这样带宽的用户,在浏览这样的页面时, ...
- [Android Pro] 使用CursorLoader异步加载数据 from 3.0
Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题.在API 11之前可以通过下载支持库,来使之前的系统支持此功能,下载页面为 http: ...
- Angular4中利用promise异步加载gojs
GoJS是一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库 gojs提供了angular的基本例子,不过是离线版 https://github.com/NorthwoodsSoftw ...
随机推荐
- jQuery事件绑定的最佳实践
如果你经常使用jQuery,那么你也许很熟悉事件绑定.这是很基本的东西,但是深入一点,你就能够找到机会让你事件驱动的代码变得不太零碎,并且更容易管理. 更好的选择器策略 让我们从基础的例子开始.下面的 ...
- Yii2 富头像上传
前台html: <div class="xz_img2 text-center"> <div class="images_flow" id=& ...
- Chapter 1 Securing Your Server and Network(6):为SQL Server訪问配置防火墙
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38082123,专题文件夹:http://blog.csdn.net/dba_huangz ...
- 秋叶PPT-三分钟教程
http://yuedu.baidu.com/ebook/0596e5f858f5f61fb73666be <说服力-让你的PPT会说话>原创PPT分享 http://www.docin. ...
- 【Servlet】Filter过滤器的编写和配置
Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...
- java发送带附件的邮件
/** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...
- 启动列表的activity
每学一个知识点就要重新创建一个项目,感觉那样太繁琐了,特别是android studio开发,没创建一个项目都会重新打开一个窗口 所以我就在那想,何不有一个功能列表,点击每一个列表项的时候就跳转到那个 ...
- IOS--- NavigationBar标题按钮
A.NavigationBar标题按钮 1.需求 在“首页”的导航栏中部设置一个“首页”文字+箭头按钮 统一设置样式 根据实际文本长度调整宽度 消除系统自带的点击高亮效果 点击按钮,箭头上下颠倒 gi ...
- CentOS下挂载U盘
插入U盘提示: [sdb] No Caching mode page present [sdb] Assuming drive cache: write through 再用fdisk -l 来查看U ...
- _blank开新窗体不符合标准?
我们要在新窗体中打开链接通常的做法是在链接后面加target="_blank",我们採用过渡型的DOCTYPE(xh tml1-transitional. dtd)时没有问题,可是 ...