Android 从缓存中读取图片并异步加载的类

本文介绍了一种用于微博图片异步加载的技术实现方案,通过使用软引用缓存已加载的图片,有效减少了重复加载同一张图片的时间消耗,并提高了应用程序的响应速度。


在新浪微博的微博列表中的图片,为了加速其显示也未了加快程序的响应,可以参考该图片异步加载类实现。

 

复制代码
public class AsyncImageLoader {
    
//SoftReference是软引用,是为了更好的为了系统回收变量
    private HashMap<String, SoftReference<Drawable>> imageCache;
    
public AsyncImageLoader() {
        imageCache 
= new HashMap<String, SoftReference<Drawable>>();
    }
    
    
public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
        
if (imageCache.containsKey(imageUrl)) {
            
//从缓存中获取
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            Drawable drawable 
= softReference.get();
            
if (drawable != null) {
                
return drawable;
            }
        }
        
final Handler handler = new Handler() {
            
public void handleMessage(Message message) {
                imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
            }
        };
        
//建立新一个新的线程下载图片
        new Thread() {
            @Override
            
public void run() {
                Drawable drawable 
= loadImageFromUrl(imageUrl);
                imageCache.put(imageUrl, 
new SoftReference<Drawable>(drawable));
                Message message 
= handler.obtainMessage(0, drawable);
                handler.sendMessage(message);
            }
        }.start();
        
return null;
    }
    
    
public static Drawable loadImageFromUrl(String url){
        URL m;
        InputStream i 
= null;
        
try {
            m 
= new URL(url);
            i 
= (InputStream) m.getContent();
        } 
catch (MalformedURLException e1) {
            e1.printStackTrace();
        } 
catch (IOException e) {
            e.printStackTrace();
        }
        Drawable d 
= Drawable.createFromStream(i, "src");
        
return d;
    }
    
    
//回调接口
    public interface ImageCallback {
        
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
    }
}
复制代码

 

 在Adapter中使用的方法为:

复制代码
public class WeiBoAdapater extends BaseAdapter{
        
private AsyncImageLoader asyncImageLoader;

        @Override
        
public int getCount() {
            
// TODO Auto-generated method stub
            return wbList.size();
        }

        @Override
        
public Object getItem(int position) {
            
// TODO Auto-generated method stub
            return wbList.get(position);
        }

        @Override
        
public long getItemId(int position) {
            
// TODO Auto-generated method stub
            return position;
        }

        @Override
        
public View getView(int position, View convertView, ViewGroup parent) {
            
// TODO Auto-generated method stub
            convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null);
            WeiBoHolder wh 
= new WeiBoHolder();
            wh.wbicon 
= (ImageView) convertView.findViewById(R.id.wbicon);
            wh.wbtext 
= (TextView) convertView.findViewById(R.id.wbtext);
            wh.wbtime 
= (TextView) convertView.findViewById(R.id.wbtime);
            wh.wbuser 
= (TextView) convertView.findViewById(R.id.wbuser);
            wh.wbimage
=(ImageView) convertView.findViewById(R.id.wbimage);
            WeiBoInfo wb 
= wbList.get(position);
            
if(wb != null)
            {
                convertView.setTag(wb.getId());
                wh.wbuser.setText(wb.getUserName());
                wh.wbtime.setText(wb.getTime());
                wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
                
                Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(), wh.wbicon, new ImageCallback(){
                   
public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imageUrl){
                       imageView.setImageDrawable(imageDrawable);
                   }
                });
                
if (cachedImage == null)
                {
                    wh.wbicon.setImageResource(R.drawable.usericon);
                }
else{
                    wh.wbicon.setImageDrawable(cachedImage);
                }                    
            }          
            
            
return convertView;
        }
        
    }
复制代码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值