一、问题描写叙述

  Volley是Google 2013年公布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方式,比方曾经从网上下载图片的步骤可能是这种流程:

在ListAdapter的getView()里開始图像的读取。

  通过AsyncTask等机制使用HttpURLConnection从server去的图片资源,在AsyncTask的onPostExecute()里设置对应ImageView的属性.而在Volley下。仅仅须要ImageLoader就可以实现。

  案例介绍——现图片新闻浏览:

二、案例主要组件

1、  RequestQueue 请求队列将StringRequest请求放入队列,并进行异步处理,主要代码:

//创建RequestQueue,可发送异步请求
RequestQueue mRequestQueue=Volley.newRequestQueue(this);
//StringRequest request=new StringRequest(…);//创建一个client请求
mRequestQueue.add(request);//将请求加到队列,将异步运行请求

2、ImageLoader 实现缓存并异步载入网络图片

//创建ImageLoader,用于将图片存入缓存和从缓存中取出图片
//第一个參数为之前创建的RequestQueue对象
//第二參数为图片缓存设置,具体解释见BitmapCache代码
ImageLoader mImageLoader=new
ImageLoader(mRequestQueue,new BitmapCache());
//载入图片,先从内存中载入,内存没有再从网络载入
//url:图片网络路径
//view 显示图片的ImageView控件,R.drawable.default未载入完毕显示的缺省图片 ,R.drawable.error载入失败显示的图片
mImageLoader.get(url,ImageLoader.getImageListener(view,
R.drawable.default, R.drawable.error));
三、案例完整代码

注:服务端环境须要自行搭建

1、  BitmapCache和SunNewsApplication组件:

  (1)BitmapCache:

public class BitmapCache implements ImageCache{
private LruCache<String, Bitmap> mCache;
public BitmapCache(){
// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常
// 使用最大可用内存值的1/8作为缓存的大小。
int maxsize=(int)(Runtime.getRuntime().maxMemory()/1024)/8;
mCache=new LruCache<String, Bitmap>(maxsize){
// 重写此方法来衡量每张图片的大小,默认返回图片数量
@Override
protected int sizeOf(String key, Bitmap value) {
return super.sizeOf(key, value);
}
};
}
/**
* 获取缓存中图片
*/
@Override
public Bitmap getBitmap(String key) {
return mCache.get(key);
}
/**
* 存入缓存
*/
@Override
public void putBitmap(String key, Bitmap bitmap) {
if(bitmap!=null)mCache.put(key, bitmap);
} }

(2)SunNewsApplication:

public class SunNewsApplication extends Application {
private ImageLoader mImageLoader;
private RequestQueue mRequestQueue; public void onCreate(){
//创建RequestQueue,可发送异步请求
mRequestQueue=Volley.newRequestQueue(this);
//创建ImageLoader,用于将图片存入缓存和从缓存中取出图片
mImageLoader=new ImageLoader(mRequestQueue,new BitmapCache());
}
public ImageLoader getmImageLoader() {
return mImageLoader;
}
public RequestQueue getmRequestQueue() {
return mRequestQueue;
}
}

2、MoreStyleNewsListViewAdapter代码:

public class MoreStyleNewsListViewAdapter extends BaseAdapter {
private Activity mActivity;
private List<NewsItem> newsList;
private ImageLoader imageLoader; public MoreStyleNewsListViewAdapter(Activity mActivity,List<NewsItem> newsList){
this.mActivity=mActivity;
this.newsList=newsList;
imageLoader=((SunNewsApplication)mActivity.getApplication()).getmImageLoader();
}
private final int TYPE_COUNT=2;
/**
* 返回数据项的显示类型数据
*/
@Override
public int getItemViewType(int position) {
return newsList!=null? newsList.get(position).getStyle():-1;
}
/**
* 返回类型个数
*/
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
} @Override
public int getCount() {
return newsList.size();
}
@Override
public Object getItem(int position) {
return newsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
NewsItem item=newsList.get(position);
if(convertView==null){
holder=new ViewHolder();
//将layout.xml转换为View
switch(item.getStyle()){
case 0:
convertView=LayoutInflater.from(mActivity).inflate(R.layout.news_item1, null);
holder.ivImg1=(ImageView)convertView.findViewById(R.id.ivNewsImg);
break;
case 1:
convertView=LayoutInflater.from(mActivity).inflate(R.layout.news_item2, null);
holder.ivImg1=(ImageView)convertView.findViewById(R.id.ivImg1);
holder.ivImg2=(ImageView)convertView.findViewById(R.id.ivImg2);
holder.ivImg3=(ImageView)convertView.findViewById(R.id.ivImg3);
break;
}
holder.tvTilte=(TextView)convertView.findViewById(R.id.tvTitle);
convertView.setTag(holder);//记录个标识
}else{
holder=(ViewHolder)convertView.getTag();
}
//向ui元素绑定数据
holder.tvTilte.setText(item.getTitle());
//载入图片,先从内存中载入。内存没有再从网络载入
imageLoader.get(item.getImgUrl()[0], ImageLoader.getImageListener(holder.ivImg1,
R.drawable.default_big, R.drawable.default_big));
switch(item.getStyle()){
case 1:
imageLoader.get(item.getImgUrl()[1], ImageLoader.getImageListener(holder.ivImg2,
R.drawable.default_big, R.drawable.default_big)); imageLoader.get(item.getImgUrl()[2], ImageLoader.getImageListener(holder.ivImg3,
R.drawable.default_big, R.drawable.default_big)); break;
}
Log.d("jereh","getView()");
return convertView;
}
private class ViewHolder{
private TextView tvTilte;
private ImageView ivImg1;
private ImageView ivImg2;
private ImageView ivImg3;
}
}

3、MainActivity代码

public class MainActivity extends Activity {
private RadioGroup rgChannel;
private List<NewsItem> newsList=new ArrayList<NewsItem>();
private MoreStyleNewsListViewAdapter adapter;
private ListView newsListView;
private RequestQueue queue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
queue=((SunNewsApplication)super.getApplication()).getmRequestQueue();
initView();
requestData(); }
private void initView(){
rgChannel=(RadioGroup)super.findViewById(R.id.rgChannel);
rgChannel.check(R.id.rbToday);
newsListView=(ListView)super.findViewById(R.id.lvNews);
adapter=new MoreStyleNewsListViewAdapter(this,newsList);
newsListView.setAdapter(adapter);
} /**
* 异步请求获得网络数据
*/
private void requestData(){
String url="http://192.168.0.107:8080/21-sun/NewsListServlet";
StringRequest request=new StringRequest(Method.GET,url,
new Response.Listener<String>() {
@Override
public void onResponse(String ret) {//请求成功调用并返回结果
Gson gson=new Gson();
List list=gson.fromJson(ret,
new TypeToken<ArrayList<NewsItem>>(){}.getType());
newsList.addAll(list);
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//请求失败调用
Log.d("jereh", "网络载入失败!");
}
});
queue.add(request);//将请求加到队列。将异步运行请求
}
}

4、NewsItem实体类

public class NewsItem {
private String title;//新闻标题
private int style; //0:普通 1:多图 2:
private String[] imgUrl;//新闻图片
…//省略setter/getter
}

5、服务端NewsListServlet代码

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/json;charset=utf-8");
List<NewsItem> newsList=new ArrayList<NewsItem>();
NewsItem item1=new NewsItem();
item1.setTitle("英达成唯一获新疆最高信用等级的养护施工企业");
item1.setStyle(0);
item1.setImgUrl( new
String[]{"http://news.21-sun.com/UserFiles/x_Image/x_20150624164627_0.jpg"});
newsList.add(item1);

NewsItem item4=new NewsItem();
item4.setTitle("德工2015路面机械质量万里行活动走进河南");
item4.setStyle(1);
item4.setImgUrl(new
String[]{"http://news.21-sun.com/UserFiles/x_Image/x_20150624101251_0.jpg",
"http://news.21-sun.com/UserFiles/x_Image/x_20150624080852_0.jpg",
"http://news.21-sun.com/UserFiles/x_Image/x_20150623141354_0.jpg"});
newsList.add(item4);
NewsItem item5=new NewsItem();
item5.setTitle("德州宝鼎总经理王桂清:实在女人爱学习");
item5.setStyle(0);
item5.setImgUrl(new String[]{"http://news.21-sun.com/UserFiles/x_Image/x_20150624123300_0.jpg"});
newsList.add(item5);
JSONArray jsonArr=JSONArray.fromObject(newsList);
System.out.println(jsonArr);
response.getWriter().print(jsonArr.toString());
}

  想要了解很多其它内容的小伙伴,能够点击查看源代码,亲自执行測试。

  疑问咨询或技术交流,请增加官方QQ群:

idkey=69fd2f84c1212ecb10062430746aa802c93431c006c1d8cd8c34c5dd4f14772d" target="_blank"> (452379712)

作者:杰瑞教育

出处:http://blog.csdn.net/jerehedu 

本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载,但未经作者允许必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

Android批量图片载入经典系列——Volley框架实现多布局的新闻列表的更多相关文章

  1. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  2. Android批量图片加载经典系列——Volley框架实现多布局的新闻列表

    一.问题描述 Volley是Google 2013年发布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方案,比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdap ...

  3. Android批量图片载入经典系列——使用LruCache、AsyncTask缓存并异步载入图片

    一.问题描写叙述 使用LruCache.AsyncTask实现批量图片的载入并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)载入图片,并放入缓存中 2.及时 ...

  4. Android批量图片加载经典系列——使用二级缓存、异步网络负载形象

    一.问题描写叙述 Android应用中常常涉及从网络中载入大量图片,为提升载入速度和效率,降低网络流量都会採用二级缓存和异步载入机制.所谓二级缓存就是通过先从内存中获取.再从文件里获取,最后才会訪问网 ...

  5. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

  6. Android开发之搜芽项目的图片载入问题(使用Volley进行网络图片载入)

    搜芽的移动开发这几天进度相对来说很的快. 可是美中不足的就是网络图片的载入问题. 我有两套方案: 1)沿用迅雷动漫的图片载入.迅雷动漫也是用的一个开源的库.可是不知道是我使用出了问题还是真的是它的问题 ...

  7. Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

    另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所 ...

  8. Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载

    一.问题描述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html# ...

  9. Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片

    一.问题描述 为提高图片加载的效率,需要对图片的采用缓存和异步加载策略,编码相对比较复杂,实际上有一些优秀的框架提供了解决方案,比如近期在git上比较活跃的xutil框架 Xutil框架提供了四大模块 ...

随机推荐

  1. JavaScript跨域解决方法大全

    跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...

  2. Redis -- 数据类型小结

    redis key 的命名规则: 对象类型:对象id:对象属性  (hset car:1: price 500.hset car:1: name:tom) 一.redis 数据类型: 1. 字符串类型 ...

  3. java静态类与非静态类区别

    java静态与非静态区别   这里的静态,指以static关键字修饰的,包括类,方法,块,字段. 非静态,指没有用static 修饰的. 静态有一些特点: 1.全局唯一,任何一次的修改都是全局性的影响 ...

  4. hdu 1226(同余搜索)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. hdu 2818(并查集,带权更新)

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. Qt笔记——多线程

    这个例子是,点击开始按钮,数字累加,点击停止按钮,数字不动. 1,新建一个类,里面是子线程的内容 #ifndef MYTHREAD_H #define MYTHREAD_H #include < ...

  7. Java学习笔记(十三)——通过Netbeans开发环境生成oracle数据库中表的对应hibernate映射文件

    [前面的话] 身体慢慢已经快好了,感觉真好,哈哈. 这篇文章要通过Hibernate对数据库进行操作,而Netbeans可以直接通过数据库逆向生成对应的映射文件.基础文章,选择性阅读. [步骤] 1. ...

  8. ubuntu18.04安装时ACPI error 无法进入系统的问题

    问题描述:安装系统时无法进入图形界面 出现 一堆错误 布拉布拉布拉 [0.101261] ACPI Error: [_ppc] Namespace lookup failure, AE_ALREADY ...

  9. hdu多校5

    1002 思路:贪心显然不好贪,直接爆搜. #include<bits/stdc++.h> #define LL long long #define fi first #define se ...

  10. shell日志重定向到null

    用输出重定向符号> 即可,格式如下:shell命令 >/dev/null 若要将标准错误输出也一并重定向,如下:shell命令 >/dev/null 2>&1这样就不管 ...