Android的HTTP操作庫Volley的基本使用教程
以前原本都用android內(nèi)建的Library來進(jìn)行GET、POST等等對API的連線與操作。
但最近想說來找找看有沒有好用的library,應(yīng)該可以事半功倍。
當(dāng)初有找了三套比較多人用的
1.Android Asynchronous Http Client
2.okhttp
square開發(fā)并且開源的,因?yàn)橹坝眠^他們家的picasso,所以對這套滿有好感的,只可惜使用方式不太喜歡
3.Volley
Volley是Google在2013年Google I/O的時候發(fā)布的,到現(xiàn)在已經(jīng)積累了很高的人氣。
Volley的GitHub項(xiàng)目地址:https://github.com/mcxiaoke/android-volley
創(chuàng)建Json請求
volley自帶了JsonObjectRequest和JsonArrayRequest分別來處理Json對象請求和Json數(shù)據(jù)請求(但是voley沒有使用gson庫寫一個GsonRequest,發(fā)送一個request,volley直接返回一個java對象,不過我們可以自己寫)。
創(chuàng)建json object請求。
發(fā)送一個請求只要這么簡單,創(chuàng)建一個JsonRequest對象,寫好response回調(diào)接口,并把這個請求放到請求隊(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請求
StringRequest可以用來請求任何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請求
上面說的都是GET請求,下面來說一下POST請求,與GET請求不同的是,只要在創(chuàng)建請求的時候?qū)⒄埱箢愋透臑镻OST請求,并且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);
創(chuàng)建Image請求
Volley庫中自帶了NetworkImageView類,這個ImageView可以自動使用volley下載圖片
1.用NetworkImageView加載圖片
首先,說明一下,加載圖片的原理:
NetworkImageView加載圖片需要一個ImageLoader和一個圖片URL,這個ImageLoader對象需要一個請求隊(duì)列對象和ImageCahe對象。調(diào)用NetworkImageView的setUrl方法后,首先會判斷當(dāng)前ImageView的URL和新傳入的URL是否一致,如果相同,就不用再發(fā)送http請求了,如果不同,那么就使用ImageLoader對象來發(fā)送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());
}
}
});
可以再簡單一點(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)寫了一個默認(rèn)的ImageListener了
Volley Cache
volley中自帶了強(qiáng)大的cache機(jī)制來管理請求cache,這會減少網(wǎng)絡(luò)請求次數(shù)和用戶等待時間。
從請求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還會繼續(xù)使用緩存的對象直到從服務(wù)器上獲取到了新的數(shù)據(jù),新的數(shù)據(jù)會覆蓋舊的數(shù)據(jù)。
AppController.getInstance().getRequestQueue().getCache().invalidate(url, true);
關(guān)閉Cache
如果你想將某一個請求的Cache功能關(guān)閉,直接調(diào)用Request的setShouldCache()方法就可以:
// String request StringRequest stringReq = new StringRequest(....); // disable cache stringReq.setShouldCache(false);
將某一URL的Cache刪除
調(diào)用Cache的remove方法可以刪除這個URL的cache:
AppController.getInstance().getRequestQueue().getCache().remove(url);
刪除所有的Cache
AppController.getInstance().getRequestQueue().getCache().clear();
取消請求
在你添加一個請求到請求隊(duì)列中的時候,你可以發(fā)現(xiàn),addToRequestQueue(request, tag)方法還接受一個tag參數(shù),這個tag就是用來標(biāo)記某一類請求的,這樣就可以取消這個tag的所有請求了:
String tag_json_arry = "json_req";
ApplicationController.getInstance().getRequestQueue().cancelAll("feed_request");
請求優(yōu)先級
在創(chuàng)建一個request的時候可以O(shè)verride Request方法的getPriority方法返回一個優(yōu)先級,優(yōu)先級分為: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ò)請求緩存
- Android Volley框架全面解析
- Android Volley框架使用方法詳解
- Android中Volley框架進(jìn)行請求網(wǎng)絡(luò)數(shù)據(jù)的使用
- Android開發(fā)中使用Volley庫發(fā)送HTTP請求的實(shí)例教程
- Android的HTTP類庫Volley入門學(xué)習(xí)教程
- Android Volley圖片加載功能詳解
- Android Volley框架使用源碼分享
- Android 開發(fā)中Volley詳解及實(shí)例
- Android中volley封裝實(shí)踐記錄
相關(guān)文章
代碼從windows下visual studio到andriod平臺遷移實(shí)現(xiàn)步驟
這篇文章主要介紹了代碼從windows下visual studio到andriod平臺遷移的修改記錄的相關(guān)資料,需要的朋友可以參考下2017-01-01
Android使用Notification實(shí)現(xiàn)普通通知欄(一)
這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)普通通知欄,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android通過原生方式獲取經(jīng)緯度與城市信息的方法
這篇文章主要給大家介紹了關(guān)于Android通過原生方式獲取經(jīng)緯度與城市信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
RecyclerView Adapter輔助類詳解及示例代碼
本文主要介紹RecyclerView Adapter輔助類的知識,這里整理了詳細(xì)資料及簡單示例代碼,幫助大家學(xué)習(xí)這部分的內(nèi)容,有興趣的小伙伴可以參考下2016-09-09
Android輔助功能實(shí)現(xiàn)自動搶紅包(附源碼)
本篇文章主要介紹了Android輔助功能實(shí)現(xiàn)自動搶紅包(附源碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Android.mk文件中添加第三方j(luò)ar文件的方法
這篇文章主要介紹了Android.mk文件中添加第三方j(luò)ar文件及引用第三方j(luò)ar包的方法,需要的朋友可以參考下2018-01-01
Android自定義scrollView實(shí)現(xiàn)頂部圖片下拉放大
這篇文章主要為大家詳細(xì)介紹了Android自定義scrollView實(shí)現(xiàn)頂部圖片下拉放大,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android Studio之Debug運(yùn)行期代碼植入的方法
這篇文章主要介紹了Android Studio之Debug運(yùn)行期代碼植入的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Android如何自定義EditText光標(biāo)與下劃線顏色詳解
在android開發(fā)中 EditTextText是我們經(jīng)常用到的,我們使用時會有一些小問題,下面這篇文章主要給大家介紹了關(guān)于利用Android如何自定義EditText光標(biāo)與下劃線顏色的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08

