Android 從緩衝中讀取圖片並非同步載入的類

來源:互聯網
上載者:User

在新浪微博的微博列表中的圖片,為了加速其顯示也未了加快程式的響應,可以參考該圖片非同步載入類實現。

 

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

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.