什么是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_list, null); 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(this, mQueue, items); mListView.setAdapter(mAdapter); } |
首先要知道Volley对图片的缓存是怎么做了,可以这么理解:
Volley将图片放入一个HashMap中,key就是图片的url,value就是图片,所以为图片地址添加一个尾数,就可以实现每次图片都是重新加载的,而不是读取第一张图片的缓存!
更多android开发教学视频尽在麦子学院:www.maiziedu.com
源码网盘:http://pan.baidu.com/s/1qWySsbU