码迷,mamicode.com
首页 > 移动开发 > 详细

通过Volley加载包含大量图片的ListView

时间:2015-07-16 13:52:10      阅读:529      评论:0      收藏:0      [点我收藏+]

标签:ListView   android   android开发   

什么是Volley?
在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,2013年的GoogleI/O大会上,Volley发布了。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
这是Volley名称的由来:a burst or emission of many things or a largeamount at once

Volley特别适合数据量不大但是通信频繁的场景。

下面我们就做一个Dome来利用Volley加载大量图片。首先看看图片缓存类BitmapCache:
  
publicclassBitmapCacheimplementsImageCache {
  
    // 如果想让整个项目共用一个图片缓存,那么这里可以将mCache设置成静态
  
    privateLruCache<String, Bitmap>mCache;
  
  
    publicBitmapCache() {
  
       if (mCache == null) {
  
           // 分配10M的缓存空间
  
           intmaxSize = 10 * 1024 * 1024;
  
           mCache = newLruCache<String, Bitmap>(maxSize) {
  
              @Override
  
              protectedintsizeOf(String key,  Bitmap value) {
  
                  returnvalue.getRowBytes() *  value.getHeight();
  
              }
  
           };
  
       }
  
    }
  
  
    @Override
  
    public Bitmap getBitmap(String url) {
  
       returnmCache.get(url);
  
    }
  
  
    @Override
  
    publicvoidputBitmap(String url,  Bitmap bitmap) {
  
       mCache.put(url, bitmap);
  
       Log.d(getClass().getSimpleName(),  "cacheSize/maxSize:" + mCache.size() + "/" + mCache.maxSize());
  
    }
  
}
  
  



再来看看ListViewAdapter中的核心方法getView()

  
@Override
  
    public View getView(int position, View  convertView, ViewGroup parent) {
  
       ViewHolder holder;
  
       if (convertView == null) {
  
           convertView = mInflater.inflate(R.layout.item_volley_listnull);
  
  
           holder = newViewHolder();
  
           holder.img = (ImageView)  convertView.findViewById(R.id.item_img);
  
           holder.name = (TextView)  convertView.findViewById(R.id.item_txt);
  
  
           convertView.setTag(holder);
  
       } else {
  
           holder = (ViewHolder)  convertView.getTag();
  
       }
  
       VolleyItem item = items.get(position);
  
       holder.name.setText(item.getName());
  
  
        // 利用Volley加载图片
  
       ImageListener listener = ImageLoader.getImageListener(holder.img, 0, R.drawable.mz_img_error);
  
       mImageLoader.get(item.getImgUrl(), listener);
  
  
       returnconvertView;
  
}
  
  



大家都知道,图片加载是OOM(OutOfMemory)的常客,那么楼主使用红米1S手机测试2000条带图片的ListView,完美运行,滑动无卡顿现象。




这里大家可能会说了,楼主,你加载的是同一张图片啊?,我加载的图片就是同一张,看看这段代码再讨论:

  
/**
  
     * 初始化List
  
     */
  
    privatevoidinitList() {
  
       mListView = (ListView) findViewById(R.id.volley_listview);
  
      
  
       // TODO初始化数据
  
       ArrayList<VolleyItem> items = newArrayList<VolleyItem>(LIST_SIZE);
  
       String imgUrl = "http://img0.bdstatic.com/img/image/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg";
  
       for (inti = 1; i<= LIST_SIZE; i++) {
  
           VolleyItem item = newVolleyItem();
  
           item.setName("我所看到的香港-" + i);
  
           // TODO为图片地址添加一个尾数,是为了多次访问图片,而不是读取第一张图片的缓存
  
           item.setImgUrl(imgUrl + "?rank=" + i);
  
           items.add(item);
  
       }
  
      
  
       // TODO绑定数据
  
       mAdapter = newVolleyListAdapter(thismQueue, items);
  
       mListView.setAdapter(mAdapter);
  
    }
  


首先要知道Volley对图片的缓存是怎么做了,可以这么理解:

Volley将图片放入一个HashMap,key就是图片的url,value就是图片,所以为图片地址添加一个尾数,就可以实现每次图片都是重新加载的,而不是读取第一张图片的缓存!

更多android开发教学视频尽在麦子学院:www.maiziedu.com

源码网盘:http://pan.baidu.com/s/1qWySsbU

通过Volley加载包含大量图片的ListView

标签:ListView   android   android开发   

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
麦子学院
加入时间:2015-07-08
  关注此人  发短消息
文章分类
麦子学院”关注的人------(0
麦子学院”的粉丝们------(0
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!