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);
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值