zoukankan      html  css  js  c++  java
  • 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;
            }
            
        }
  • 相关阅读:
    kafka原理深入研究 (转 )
    redis——持久化篇
    IDEA 配置环境和相关工具整理(新手入门)
    Spring Data JPA(官方文档翻译)
    springboot:spring data jpa介绍
    JDK8-十大新特性-附demo
    JDK8新特性一览
    Maven中的pom.xml配置文件详解
    数据库面试题(更新中...)
    互联网协议系列
  • 原文地址:https://www.cnblogs.com/alwaysyouare/p/2182674.html
Copyright © 2011-2022 走看看