Android的HTTP操作库Volley的基本使用教程
以前原本都用android内建的library来进行get、post等等对api的连线与操作。
但最近想说来找找看有没有好用的library,应该可以事半功倍。
当初有找了三套比较多人用的
1.android asynchronous http client
2.okhttp
square开发并且开源的,因为之前用过他们家的picasso,所以对这套满有好感的,只可惜使用方式不太喜欢
3.volley
volley是google在2013年google i/o的时候发布的,到现在已经积累了很高的人气。
volley的github项目地址:https://github.com/mcxiaoke/android-volley
创建json请求
volley自带了jsonobjectrequest和jsonarrayrequest分别来处理json对象请求和json数据请求(但是voley没有使用gson库写一个gsonrequest,发送一个request,volley直接返回一个java对象,不过我们可以自己写)。
创建json object请求。
发送一个请求只要这么简单,创建一个jsonrequest对象,写好response回调接口,并把这个请求放到请求队列中就可以了。jsonarrayrequest也类似。
// tag used to cancel the request string tag_json_obj = "json_obj_req"; string url = "http://api.androidhive.info/volley/person_object.json"; jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.get,url, null, new response.listener<jsonobject>() { @override public void onresponse(jsonobject response) { log.d(tag, response.tostring()); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { volleylog.d(tag, "error: " + error.getmessage()); } }); // adding request to request queue appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);
创建string请求
stringrequest可以用来请求任何string类型的数据:json,xml,文本等等。
// tag used to cancel the request string tag_string_req = "string_req"; string url = "http://api.androidhive.info/volley/string_response.html"; progressdialog pdialog = new progressdialog(this); pdialog.setmessage("loading..."); pdialog.show(); stringrequest strreq = new stringrequest(method.get, url, new response.listener<string>() { @override public void onresponse(string response) { log.d(tag, response.tostring()); pdialog.hide(); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { volleylog.d(tag, "error: " + error.getmessage()); pdialog.hide(); } }); // adding request to request queue appcontroller.getinstance().addtorequestqueue(strreq, tag_string_req);
创建post请求
上面说的都是get请求,下面来说一下post请求,与get请求不同的是,只要在创建请求的时候将请求类型改为post请求,并且override request的getparams方法即可。
// tag used to cancel the request string tag_json_obj = "json_obj_req"; string url = "http://api.androidhive.info/volley/person_object.json"; progressdialog pdialog = new progressdialog(this); pdialog.setmessage("loading..."); pdialog.show(); jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.post, url, null, new response.listener<jsonobject>() { @override public void onresponse(jsonobject response) { log.d(tag, response.tostring()); pdialog.hide(); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { volleylog.d(tag, "error: " + error.getmessage()); pdialog.hide(); } }) { @override protected map<string, string> getparams() { map<string, string> params = new hashmap<string, string>(); params.put("name", "androidhive"); params.put("email", "abc@androidhive.info"); params.put("password", "password123"); return params; } }; // adding request to request queue appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);
添加请求头部信息
// tag used to cancel the request string tag_json_obj = "json_obj_req"; string url = "http://api.androidhive.info/volley/person_object.json"; progressdialog pdialog = new progressdialog(this); pdialog.setmessage("loading..."); pdialog.show(); jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.post,url, null,new response.listener<jsonobject>() { @override public void onresponse(jsonobject response) { log.d(tag, response.tostring()); pdialog.hide(); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { volleylog.d(tag, "error: " + error.getmessage()); pdialog.hide(); } }) { /** * passing some request headers * */ @override public map<string, string> getheaders() throws authfailureerror { hashmap<string, string> headers = new hashmap<string, string>(); headers.put("content-type", "application/json"); headers.put("apikey", "xxxxxxxxxxxxxxx"); return headers; } }; // adding request to request queue appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);
创建image请求
volley库中自带了networkimageview类,这个imageview可以自动使用volley下载图片
1.用networkimageview加载图片
首先,说明一下,加载图片的原理:
networkimageview加载图片需要一个imageloader和一个图片url,这个imageloader对象需要一个请求队列对象和imagecahe对象。调用networkimageview的seturl方法后,首先会判断当前imageview的url和新传入的url是否一致,如果相同,就不用再发送http请求了,如果不同,那么就使用imageloader对象来发送http请求获取图片。
imageloader imageloader = appcontroller.getinstance().getimageloader(); // if you are using networkimageview imgnetworkview.setimageurl(const.url_image, imageloader);
加载一个图片只要这么简单~~~
2.用imageview来加载图片
这个过程和networkimageview类似
imageloader imageloader = appcontroller.getinstance().getimageloader(); // if you are using normal imageview imageloader.get(const.url_image, new imagelistener() { @override public void onerrorresponse(volleyerror error) { log.e(tag, "image load error: " + error.getmessage()); } @override public void onresponse(imagecontainer response, boolean arg1) { if (response.getbitmap() != null) { // load image into imageview imageview.setimagebitmap(response.getbitmap()); } } });
可以再简单一点:
// loading image with placeholder and error image imageloader.get(const.url_image, imageloader.getimagelistener(imageview, r.drawable.ico_loading, r.drawable.ico_error));
imageloader.getimagelistener方法中已经写了一个默认的imagelistener了
volley cache
volley中自带了强大的cache机制来管理请求cache,这会减少网络请求次数和用户等待时间。
从请求cache中加载请求:
cache cache = appcontroller.getinstance().getrequestqueue().getcache(); entry entry = cache.get(url); if(entry != null){ try { string data = new string(entry.data, "utf-8"); // handle data, like converting it to xml, json, bitmap etc., } catch (unsupportedencodingexception e) { e.printstacktrace(); } } }else{ // cached response doesn't exists. make network call here }
使请求缓存失效
失效并不意味这删除,volley还会继续使用缓存的对象直到从服务器上获取到了新的数据,新的数据会覆盖旧的数据。
appcontroller.getinstance().getrequestqueue().getcache().invalidate(url, true);
关闭cache
如果你想将某一个请求的cache功能关闭,直接调用request的setshouldcache()方法就可以:
// string request stringrequest stringreq = new stringrequest(....); // disable cache stringreq.setshouldcache(false);
将某一url的cache删除
调用cache的remove方法可以删除这个url的cache:
appcontroller.getinstance().getrequestqueue().getcache().remove(url);
删除所有的cache
appcontroller.getinstance().getrequestqueue().getcache().clear();
取消请求
在你添加一个请求到请求队列中的时候,你可以发现,addtorequestqueue(request, tag)方法还接受一个tag参数,这个tag就是用来标记某一类请求的,这样就可以取消这个tag的所有请求了:
string tag_json_arry = "json_req"; applicationcontroller.getinstance().getrequestqueue().cancelall("feed_request");
请求优先级
在创建一个request的时候可以override request方法的getpriority方法返回一个优先级,优先级分为:normal, low, immediate, high。
private priority priority = priority.high; stringrequest strreq = new stringrequest(method.get, const.url_string_req, new response.listener<string>() { @override public void onresponse(string response) { log.d(tag, response.tostring()); msgresponse.settext(response.tostring()); hideprogressdialog(); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { volleylog.d(tag, "error: " + error.getmessage()); hideprogressdialog(); } }) { @override public priority getpriority() { return priority; } };
下一篇: PHP7常量数组用法分析
推荐阅读
-
Android的HTTP操作库Volley的基本使用教程
-
Android App开发中RecyclerView控件的基本使用教程
-
Android的多媒体管理库Glide的基本使用示例
-
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
-
Android App开发中RecyclerView控件的基本使用教程
-
Android应用中内嵌SQLite数据库的基本操作指南
-
在MySQL中使用子查询和标量子查询的基本操作教程
-
Android的HTTP类库Volley入门学习教程
-
安装和使用percona-toolkit来辅助操作MySQL的基本教程
-
Android应用中内嵌SQLite数据库的基本操作指南