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

什么是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

时间: 2024-10-10 11:12:16

通过Volley加载包含大量图片的ListView的相关文章

Android学习笔记---使用Volley加载图片

Volley加载图片 ImageLoader使用法ImageLoader imageLoader = new ImageLoader(requestQueue,new ImageLoood()); ImageLoader.ImageListener imageListener = imageLoader.getImageListener(imageView,R.mipmap.ic_launcher,R.mipmap.ic_launcher); imageLoader.get(strUrl,ima

Android Volley入门到精通:使用Volley加载网络图片

在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完全解析(一),初识Volley的基本用法. 在上篇文章中有提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架.我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们

Volley加载不出图片的问题

问题分析:加载后台图片的时候,发现加载不出来,后来发现图片的url格式是: http://192.168.1.71/\carhome\shop\778c2bc3ec0a49e1969b24b3a8e62f31\detail\DSC04209.JPG 因为Volley请求,不识别url中有"\" 所以需要把"|"替换成"/" 以下是工具类 public class StringUtil { public static String formatUr

Android--使用Volley加载网络图片

1. ImageRequest的用法 前面我们已经学习过了StringRequest和JsonRequest的用法,并且总结出了它们的用法都是非常类似的,基本就是进行以下三步操作即可: 1. 创建一个RequestQueue对象. 2. 创建一个Request对象. 3. 将Request对象添加到RequestQueue里面. 其中,StringRequest和JsonRequest都是继承自Request的,所以它们的用法才会如此类似.那么不用多说,今天我们要学习的ImageRequest,

Android Volley完全解析(二),使用Volley加载网络图片

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482165 在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完全解析(一),初识Volley的基本用法. 在上篇文章中有提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成

ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原因在于它的高效(如何实现的?).ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml).ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListV

使用Volley加载网络图片

我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们也可以实现基本类似的效果,并且在性能上也豪不逊色于Universal-Image-Loader,下面我们就来具体学习一下吧. 1. ImageRequest的用法 前面我们已经学习过了StringRequest和JsonRequest的用法,并且总结出了它们的用法都是非常类似的,基本就是进行以下三步操作即可: 1. 创建一个RequestQueue对象. 2. 创建一个Request

Volley 加载网络图片

Volley提供了一个NetworkImageView类. 利用NetworkImageView这个类,可以更有效率地去从网络去获取图片,因为它里面帮我们多设置了一个缓存,但这缓存得自己实现. 1)xml文件:    <FrameLayout        android:id="@+id/flImageContainer"        android:layout_width="match_parent"        android:layout_hei

ListView上拉加载和下拉刷新多种实现方式

ListView上拉加载和下拉刷新多种实现方式 该篇为ListView下拉刷新和上拉加载实现的各种方法大合集.可能在具体的细节逻辑上处理不太到位,但基本上完成逻辑的实现.细节方面,个人可以根据自己的需求进行完善. 该博客将以四种思路来完成下拉刷新和上拉加载 自定义View实现上拉加载和下拉刷新 使用PullToRefresh 实现上拉加载和下拉刷新 使用Ultra-Pull-To-Refresh实现上拉加载和下拉刷新 使用SwipeToRefreshLayout实现上拉加载和下拉刷新 如果你对L