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;
        }
        
    }
复制代码

你可能感兴趣的:(Android 从缓存中读取图片并异步加载的类)