Android的HTTP操作庫(kù)Volley的基本使用教程
以前原本都用android內(nèi)建的Library來(lái)進(jìn)行GET、POST等等對(duì)API的連線與操作。
但最近想說(shuō)來(lái)找找看有沒有好用的library,應(yīng)該可以事半功倍。
當(dāng)初有找了三套比較多人用的
1.Android Asynchronous Http Client
2.okhttp
square開發(fā)并且開源的,因?yàn)橹坝眠^(guò)他們家的picasso,所以對(duì)這套滿有好感的,只可惜使用方式不太喜歡
3.Volley
Volley是Google在2013年Google I/O的時(shí)候發(fā)布的,到現(xiàn)在已經(jīng)積累了很高的人氣。
Volley的GitHub項(xiàng)目地址:https://github.com/mcxiaoke/android-volley
創(chuàng)建Json請(qǐng)求
volley自帶了JsonObjectRequest和JsonArrayRequest分別來(lái)處理Json對(duì)象請(qǐng)求和Json數(shù)據(jù)請(qǐng)求(但是voley沒有使用gson庫(kù)寫一個(gè)GsonRequest,發(fā)送一個(gè)request,volley直接返回一個(gè)java對(duì)象,不過(guò)我們可以自己寫)。
創(chuàng)建json object請(qǐng)求。
發(fā)送一個(gè)請(qǐng)求只要這么簡(jiǎn)單,創(chuàng)建一個(gè)JsonRequest對(duì)象,寫好response回調(diào)接口,并把這個(gè)請(qǐng)求放到請(qǐng)求隊(duì)列中就可以了。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);
創(chuàng)建String請(qǐng)求
StringRequest可以用來(lái)請(qǐng)求任何string類型的數(shù)據(jù):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);
創(chuàng)建POST請(qǐng)求
上面說(shuō)的都是GET請(qǐng)求,下面來(lái)說(shuō)一下POST請(qǐng)求,與GET請(qǐng)求不同的是,只要在創(chuàng)建請(qǐng)求的時(shí)候?qū)⒄?qǐng)求類型改為POST請(qǐng)求,并且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);
添加請(qǐng)求頭部信息
// 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);
創(chuàng)建Image請(qǐng)求
Volley庫(kù)中自帶了NetworkImageView類,這個(gè)ImageView可以自動(dòng)使用volley下載圖片
1.用NetworkImageView加載圖片
首先,說(shuō)明一下,加載圖片的原理:
NetworkImageView加載圖片需要一個(gè)ImageLoader和一個(gè)圖片URL,這個(gè)ImageLoader對(duì)象需要一個(gè)請(qǐng)求隊(duì)列對(duì)象和ImageCahe對(duì)象。調(diào)用NetworkImageView的setUrl方法后,首先會(huì)判斷當(dāng)前ImageView的URL和新傳入的URL是否一致,如果相同,就不用再發(fā)送http請(qǐng)求了,如果不同,那么就使用ImageLoader對(duì)象來(lái)發(fā)送http請(qǐng)求獲取圖片。
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); // If you are using NetworkImageView imgNetWorkView.setImageUrl(Const.URL_IMAGE, imageLoader);
加載一個(gè)圖片只要這么簡(jiǎn)單~~~
2.用ImageView來(lái)加載圖片
這個(gè)過(guò)程和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()); } } });
可以再簡(jiǎn)單一點(diǎn):
// 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方法中已經(jīng)寫了一個(gè)默認(rèn)的ImageListener了
Volley Cache
volley中自帶了強(qiáng)大的cache機(jī)制來(lái)管理請(qǐng)求cache,這會(huì)減少網(wǎng)絡(luò)請(qǐng)求次數(shù)和用戶等待時(shí)間。
從請(qǐng)求Cache中加載請(qǐng)求:
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 }
使請(qǐng)求緩存失效
失效并不意味這刪除,Volley還會(huì)繼續(xù)使用緩存的對(duì)象直到從服務(wù)器上獲取到了新的數(shù)據(jù),新的數(shù)據(jù)會(huì)覆蓋舊的數(shù)據(jù)。
AppController.getInstance().getRequestQueue().getCache().invalidate(url, true);
關(guān)閉Cache
如果你想將某一個(gè)請(qǐng)求的Cache功能關(guān)閉,直接調(diào)用Request的setShouldCache()方法就可以:
// String request StringRequest stringReq = new StringRequest(....); // disable cache stringReq.setShouldCache(false);
將某一URL的Cache刪除
調(diào)用Cache的remove方法可以刪除這個(gè)URL的cache:
AppController.getInstance().getRequestQueue().getCache().remove(url);
刪除所有的Cache
AppController.getInstance().getRequestQueue().getCache().clear();
取消請(qǐng)求
在你添加一個(gè)請(qǐng)求到請(qǐng)求隊(duì)列中的時(shí)候,你可以發(fā)現(xiàn),addToRequestQueue(request, tag)方法還接受一個(gè)tag參數(shù),這個(gè)tag就是用來(lái)標(biāo)記某一類請(qǐng)求的,這樣就可以取消這個(gè)tag的所有請(qǐng)求了:
String tag_json_arry = "json_req"; ApplicationController.getInstance().getRequestQueue().cancelAll("feed_request");
請(qǐng)求優(yōu)先級(jí)
在創(chuàng)建一個(gè)request的時(shí)候可以O(shè)verride Request方法的getPriority方法返回一個(gè)優(yōu)先級(jí),優(yōu)先級(jí)分為: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; } };
- Android 中Volley二次封裝并實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求緩存
- Android Volley框架全面解析
- Android Volley框架使用方法詳解
- Android中Volley框架進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的使用
- Android開發(fā)中使用Volley庫(kù)發(fā)送HTTP請(qǐng)求的實(shí)例教程
- Android的HTTP類庫(kù)Volley入門學(xué)習(xí)教程
- Android Volley圖片加載功能詳解
- Android Volley框架使用源碼分享
- Android 開發(fā)中Volley詳解及實(shí)例
- Android中volley封裝實(shí)踐記錄
相關(guān)文章
Android轉(zhuǎn)場(chǎng)效果實(shí)現(xiàn)示例淺析
這篇文章主要為大家介紹了Android轉(zhuǎn)場(chǎng)效果實(shí)現(xiàn)示例淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android開發(fā)ImageView圖片無(wú)法顯示解決過(guò)程
在Android中ImageView無(wú)法顯示加載的本地SDCard圖片:過(guò)程為先調(diào)用本地照相機(jī)程序攝像,然后將拍攝的圖片加載在ImageView中顯示,具體解決方法如下,感興趣的朋友可以參考下哈2013-06-06Android矢量圖之VectorDrawable類自由填充色彩
這篇文章主要介紹了Android矢量圖之VectorDrawable類自由填充色彩的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05Android仿QQ、微信聊天界面長(zhǎng)按提示框效果
最近在工作項(xiàng)目中要實(shí)現(xiàn)一個(gè)長(zhǎng)按提示 “復(fù)制” 的功能,類似于QQ、微信聊天界面長(zhǎng)按提示框效果,本來(lái)想偷懶在網(wǎng)上找個(gè)開源的項(xiàng)目用,但是看了好幾個(gè)都不是很滿意,所以就打算按照自己的思路來(lái)實(shí)現(xiàn)一個(gè)。下面分享給大家,有需要的朋友們可以參考借鑒。2016-11-11Android使用Intent發(fā)送短信的實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用Intent發(fā)送短信的實(shí)現(xiàn)方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Android短信發(fā)送功能的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07Android 利用廣播監(jiān)聽usb連接狀態(tài)(變化情況)
這篇文章主要介紹了Android 利用廣播監(jiān)聽usb連接狀態(tài),需要的朋友可以參考下2017-06-06Android自動(dòng)獲取輸入短信驗(yàn)證碼庫(kù)AutoVerifyCode詳解
這篇文章主要為大家詳細(xì)介紹了Android自動(dòng)獲取輸入短信驗(yàn)證碼庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07viewpager實(shí)現(xiàn)自動(dòng)循環(huán)輪播圖
這篇文章主要為大家詳細(xì)介紹了viewpager實(shí)現(xiàn)自動(dòng)循環(huán)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01