• 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;
            }
            
        }
  • 相关阅读:
    尾递归
    Appium环境搭建
    虚拟机与主机的相互访问,虚拟机访问外网
    Python
    npm i 安装
    redis过期键删除策略
    Redis的过期策略和内存淘汰机制
    redis的两种持久化方案
    JVM 方法内联
    进程/线程/协程
  • 原文地址:https://www.cnblogs.com/alwaysyouare/p/2182674.html
Copyright © 2020-2023  润新知