Android中Volley框架进行请求网络数据的使用
问题的阐述:android sdk中的httpclient和httpurlconnection两种请求方式用来处理网络的复杂的操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;
解决:volley就是为解决这些而生,它与2013年google i/o大会上被提出:使得android应用网络操作更方便更快捷;抽象了底层http client等实现的细节,让开发者更专注与产生restful request。另外,volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
volley可以说是把asynchttpclient和universal-image-loader的优点集于了一身,既可以像asynchttpclient一样非常简单地进行http通信,也可以像universal-image-loader一样轻松加载网络上的图片。除了简单易用之外,volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,volley的表现就会非常糟糕
1、volley到底有哪些特点呢?
自动调度网络请求
多个并发的网络连接
通过使用标准的http缓存机制保持磁盘和内存响应的一致
支持请求优先级
支持取消请求的强大api,可以取消单个请求或多个
易于定制
健壮性:便于正确的更新ui和获取数据
包含调试和追踪工具
2、volley中的requestqueue 和 request
● requestqueue 用来执行请求的请求队列
● request 用来构造一个请求对象
● request对象主要有以下几种类型:
a. stringrequest 响应的主体为字符串
b. jsonarrayrequest 发送和接收json数组
c. jsonobjectrequest 发送和接收json对象
d. imagerequest 发送和接收image
3、volley的使用步骤:
(1)创建一个android项目,并导入volley的jar包
(2)get的请求方式:
//创建requestqueue对象 requestqueue requestqueue = volley.newrequestqueue(this); string url="http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android"; //创建request对象 stringrequest request=new stringrequest(url, new response.listener<string>() { /** * 请求成功的结果 * @param response 这个参数就是访问网络数据的结果 */ @override public void onresponse(string response) { // } }, new response.errorlistener() { /** * 这个方法用来监听访问错误,展示的结果 * 07-19 04:17:13.414: e/tag(1181): ------------- * com.android.volley.volleyerror: * java.lang.securityexception: * permission denied (missing internet permission?)========================== */ @override public void onerrorresponse(volleyerror error) { log.e("tag","-------------"+ error+"=========================="); } }); //将request对象添加到requestqueue里面。 requestqueue.add(request);
(3)post请求的方式:
通过指定请求方法为request.method.post使其成为post请求,然后重新getparams方法设置请求参数。当发出post请求的时候,volley会尝试调用stringrequest的父类——request中的getparams()方法来获取post参数。
//创建requestqueue对象 requestqueue requestqueue = volley.newrequestqueue(this); string url=”http://api.m.panda.tv/ajax_get_all_subcate”; stringrequest request=new stringrequest(request.method.post, url, new response.listener() { @override public void onresponse(string response) { log.e("tag", "请求成功============"+response); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { log.e("tag", "请求成功============"+error); } }){ /** * 重写getparams方法设置参数,post添加参数的方法 */ @override protected map<string, string> getparams() throws authfailureerror { hashmap<string, string> params = new hashmap<string,string>(); params.put("__version", "1.0.1.1300"); params.put("__plat", "android"); return params; } }; requestqueue.add(request);
(3)加载图片的方式:
第一种加载图片的方法
requestqueue requestqueue = volley.newrequestqueue(context); string img = datas.getimg(); //第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。 //第五个参数用于指定图片的颜色属性 imagerequest request=new imagerequest(img, new response.listener<bitmap>() { @override public void onresponse(bitmap response) { holder.iv.setimagebitmap(response); } }, 0, 0,bitmap.config.argb_8888, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { // todo auto-generated method stub } }); requestqueue.add(request);
第二种加载图片的方法
其实加载图片的功能还远远不止这些,使用imageloader可以实现对图片的缓存,还可以过滤重复链接,避免发送重复的请求
imageloader的使用方法概括为以下几步
1. 创建一个requestqueue对象。
2. 创建一个imageloader对象。
3. 获取一个imagelistener对象。
4. 调用imageloader的get()方法加载网络上的图片。
//继承imagecache,使用lrucache实现缓存 public class bitmapcache implements imageloader.imagecache { private lrucache<string, bitmap> mcache; public bitmapcache() { int maxsize = 10 * 1024 * 1024; mcache = new lrucache<string, bitmap>(maxsize) { @override protected int sizeof(string key, bitmap bitmap) { return bitmap.getrowbytes() * bitmap.getheight(); } }; } @override public bitmap getbitmap(string url) { return mcache.get(url); } @override public void putbitmap(string url, bitmap bitmap) { mcache.put(url, bitmap); } } private void getimagebyimageloader() { imageview iv= (imageview) findviewbyid(r.id.iv); requestqueue queue = volley.newrequestqueue(getapplicationcontext()); string url = "https://www.baidu.com/img/bdlogo.png"; imageloader loader=new imageloader(queue,new bitmapcache() ); // 第一个参数指定用于显示图片的imageview控件 // 第二个参数指定加载图片的过程中显示的图片 // 第三个参数指定加载图片失败的情况下显示的图片 imageloader.imagelistener listener=imageloader.getimagelistener(iv,r.mipmap.ic_launcher,r.mipmap.ic_launcher); // 调用imageloader的get()方法来加载图片 // 第一个参数就是图片的url地址 // 第二个参数则是刚刚获取到的imagelistener对象 // 如果想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度,即通过第三第四个参数指定 loader.get(url,listener); }
第三种加载图片的方法
最后,volley提供了一种自定义imageview来加载图片,其使用方法可概括为
1. 创建一个requestqueue对象。
2. 创建一个imageloader对象。
3. 在布局文件中添加一个networkimageview控件。
4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址。
步骤一:我们在布局中申明该控件
<com.android.volley.toolbox.networkimageview android:id="@+id/network_image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" />
步骤二:在程序中实现加载
public void networkimageview(){ requestqueue queue = volley.newrequestqueue(getapplicationcontext()); imageloader loader=new imageloader(queue,new bitmapcache() ); networkimageview niv= (networkimageview) findviewbyid(r.id.network_image_view); niv.setdefaultimageresid(r.mipmap.ic_launcher);//设置加载中显示的图片 niv.seterrorimageresid(r.mipmap.ic_launcher);//设置加载失败时显示的图片 niv.setimageurl("https://www.baidu.com/img/bdlogo.png", loader);//设置目标图片的url地址 }
4、自定义request
在实际应用中,往往需要将http请求与json进行集成,而volley正恰恰支持这样的方式,不过需要我们自己自定义request,这里我们使用google的gson库进行集成。
1. 继承request类
2. 重写parsenetworkresponse,实现json与实体类转换,由于实体类未定,所以采用泛型
下文用到的json字符串如下
{“name”:”lizhangqu”,”age”:16}
步骤一:
package cn.edu.zafu.http; import com.android.volley.networkresponse; import com.android.volley.parseerror; import com.android.volley.request; import com.android.volley.response; import com.android.volley.toolbox.httpheaderparser; import com.google.gson.gson; import java.io.unsupportedencodingexception; /** * created by lizhangqu on 2015/5/7. */ public class gsonrequest<t> extends request<t> { private final response.listener<t> mlistener; private gson mgson; private class<t> mclass; public gsonrequest(int method, string url, class<t> clazz, response.listener<t> listener, response.errorlistener errorlistener) { super(method, url, errorlistener); mgson = new gson(); mclass = clazz; mlistener = listener; } public gsonrequest(string url, class<t> clazz, response.listener<t> listener, response.errorlistener errorlistener) { this(method.get, url, clazz, listener, errorlistener); } @override protected response<t> parsenetworkresponse(networkresponse response) { try { string jsonstring = new string(response.data, httpheaderparser.parsecharset(response.headers)); return response.success(mgson.fromjson(jsonstring, mclass), httpheaderparser.parsecacheheaders(response)); } catch (unsupportedencodingexception e) { return response.error(new parseerror(e)); } } @override protected void deliverresponse(t response) { mlistener.onresponse(response); } }
步骤二:编写测试实体类,两个字段一个name一个age
package cn.edu.zafu.http; /** * created by lizhangqu on 2015/5/7. */ public class person { private string name; private int age; public string getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } @override public string tostring() { return "person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
步骤三:调用方法和stringrequest是一样的。如下所示
private void json(){ requestqueue queue = volley.newrequestqueue(getapplicationcontext()); string url = "http://121.41.119.107/test/index.php"; gsonrequest<person> request=new gsonrequest<person>(url, person.class, new response.listener<person>() { @override public void onresponse(person response) { log.d("tag",response.tostring()); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { } }); queue.add(request); }
以上所述是小编给大家介绍的android中volley框架进行请求网络数据的使用,希望对大家有所帮助
推荐阅读
-
Android中Volley框架进行请求网络数据的使用
-
Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
-
Android中Volley框架进行请求网络数据的使用
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 一 框架配置
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之六使用过滤器进行全局请求数据验证
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 三 文件上传(支持多文件/多图片上传)
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之六使用过滤器进行全局请求数据验证
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 三 文件上传(支持多文件/多图片上传)
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 一 框架配置
-
Android Volley网络请求框架使用Demo