Android開發(fā)中使用Volley庫發(fā)送HTTP請(qǐng)求的實(shí)例教程
Android Volley 是Google開發(fā)的一個(gè)網(wǎng)絡(luò)lib,可以讓你更加簡單并且快速的訪問網(wǎng)絡(luò)數(shù)據(jù)。Volley庫的網(wǎng)絡(luò)請(qǐng)求都是異步的,你不必?fù)?dān)心異步處理問題。
Volley的優(yōu)點(diǎn):
- 請(qǐng)求隊(duì)列和請(qǐng)求優(yōu)先級(jí)
- 請(qǐng)求Cache和內(nèi)存管理
- 擴(kuò)展性性強(qiáng)
- 可以取消請(qǐng)求
下載和編譯volley.jar
需要安裝git,ant,android sdk
clone代碼:
git clone https://android.googlesource.com/platform/frameworks/volley
編譯jar:
android update project -p . ant jar
添加volley.jar到你的項(xiàng)目中
不過已經(jīng)有人將volley的代碼放到github上了:
https://github.com/mcxiaoke/android-volley,你可以使用更加簡單的方式來使用volley:
Maven
format: jar
<dependency> <groupId>com.mcxiaoke.volley</groupId> <artifactId>library</artifactId> <version>1.0.6</version> </dependency>
Gradle
format: jar
compile 'com.mcxiaoke.volley:library:1.0.6'
Volley工作原理圖
創(chuàng)建Volley 單例
使用volley時(shí),必須要?jiǎng)?chuàng)建一個(gè)請(qǐng)求隊(duì)列RequestQueue,使用請(qǐng)求隊(duì)列的最佳方式就是將它做成一個(gè)單例,整個(gè)app使用這么一個(gè)請(qǐng)求隊(duì)列。
public class AppController extends Application { public static final String TAG = AppController.class .getSimpleName(); private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static AppController mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized AppController getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public ImageLoader getImageLoader() { getRequestQueue(); if (mImageLoader == null) { mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache()); } return this.mImageLoader; } public <T> void addToRequestQueue(Request<T> req, String tag) { // set the default tag if tag is empty req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } }
另外,你還需要一個(gè)Cache來存放請(qǐng)求的圖片:
public class LruBitmapCache extends LruCache<String, Bitmap> implement ImageCache { public static int getDefaultLruCacheSize() { final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; return cacheSize; } public LruBitmapCache() { this(getDefaultLruCacheSize()); } public LruBitmapCache(int sizeInKiloBytes) { super(sizeInKiloBytes); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 1024; } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } }
別忘記在AndroidManifest.xml文件中添加android.permission.INTERNET權(quán)限。
HTTP請(qǐng)求實(shí)例
private Context mContext; private RequestQueue mRequestQueue; private StringRequest mStringRequest; // 利用Volley實(shí)現(xiàn)Post請(qǐng)求 private void volley_post() { String url = "http://aplesson.com/wap/api/user.php?action=login"; mContext = this; mRequestQueue = Volley.newRequestQueue(mContext); mStringRequest = new StringRequest(Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("請(qǐng)求結(jié)果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString()); } }) { // 攜帶參數(shù) @Override protected HashMap<String, String> getParams() throws AuthFailureError { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("un", "852041173"); hashMap.put("pw", "852041173abc"); return hashMap; } // Volley請(qǐng)求類提供了一個(gè) getHeaders()的方法,重載這個(gè)方法可以自定義HTTP 的頭信息。(也可不實(shí)現(xiàn)) public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("Accept", "application/json"); headers.put("Content-Type", "application/json; charset=UTF-8"); return headers; } }; mRequestQueue.add(mStringRequest); } private JsonObjectRequest mJsonObjectRequest; // 利用Volley實(shí)現(xiàn)Json數(shù)據(jù)請(qǐng)求 private void volley_json() { mContext = this; String url = "http://aplesson.com/data/101010100.html"; // 1 創(chuàng)建RequestQueue對(duì)象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 創(chuàng)建JsonObjectRequest對(duì)象 mJsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("請(qǐng)求結(jié)果:" + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString()); } }); // 3 將JsonObjectRequest添加到RequestQueue mRequestQueue.add(mJsonObjectRequest); } // 利用Volley實(shí)現(xiàn)Get請(qǐng)求 private void volley_get() { mContext = this; String url = "http://www.aplesson.com/"; // 1 創(chuàng)建RequestQueue對(duì)象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 創(chuàng)建StringRequest對(duì)象 mStringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("請(qǐng)求結(jié)果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString()); } }); // 3 將StringRequest添加到RequestQueue mRequestQueue.add(mStringRequest); }
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。JsonObjectRequest:返回JSON對(duì)象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數(shù)據(jù),更加靈活。
另外可以繼承Request<T>自定義Request。
取消Request
Activity里面啟動(dòng)了網(wǎng)絡(luò)請(qǐng)求,而在這個(gè)網(wǎng)絡(luò)請(qǐng)求還沒返回結(jié)果的時(shí)候,Activity被結(jié)束了,此時(shí)如果繼續(xù)使用其中的Context等,除了無辜的浪費(fèi)CPU,電池,網(wǎng)絡(luò)等資源,有可能還會(huì)導(dǎo)致程序crash,所以,我們需要處理這種一場(chǎng)情況。使用Volley的話,我們可以在Activity停止的時(shí)候,同時(shí)取消所有或部分未完成的網(wǎng)絡(luò)請(qǐng)求。Volley里所有的請(qǐng)求結(jié)果會(huì)返回給主進(jìn)程,如果在主進(jìn)程里取消了某些請(qǐng)求,則這些請(qǐng)求將不會(huì)被返回給主線程。Volley支持多種request取消方式。
可以針對(duì)某些個(gè)request做取消操作:
@Override public void onStop() { for (Request <?> req : mRequestQueue) { req.cancel(); } }
取消這個(gè)隊(duì)列里的所有請(qǐng)求:
@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll(this); }
可以根據(jù)RequestFilter或者Tag來終止某些請(qǐng)求
@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll( new RequestFilter() {}); or mRequestQueue.cancelAll(new Object()); }
Volley支持http的GET、POST、PUT、DELETE等方法。
- 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的HTTP操作庫Volley的基本使用教程
- Android的HTTP類庫Volley入門學(xué)習(xí)教程
- Android Volley圖片加載功能詳解
- Android Volley框架使用源碼分享
- Android 開發(fā)中Volley詳解及實(shí)例
- Android中volley封裝實(shí)踐記錄
相關(guān)文章
Android仿微信列表滑動(dòng)刪除 如何實(shí)現(xiàn)滑動(dòng)列表SwipeListView
這篇文章主要為大家詳細(xì)介紹了Android仿微信列表滑動(dòng)刪除,如何實(shí)現(xiàn)滑動(dòng)列表SwipeListView,感興趣的小伙伴們可以參考一下2016-08-08Android Flutter利用貝塞爾曲線畫一個(gè)小海豚
貝塞爾曲線的應(yīng)用填補(bǔ)了計(jì)算機(jī)繪制與手繪之前的差距,更能表達(dá)人想畫出的曲線。本文就將利用貝塞爾曲線繪制一個(gè)可愛的小海豚,需要的可以參考一下2022-04-04說說Android的UI刷新機(jī)制的實(shí)現(xiàn)
這篇文章主要介紹了說說Android的UI刷新機(jī)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android逆向入門之常見Davlik字節(jié)碼解析
Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的虛擬機(jī)。Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一,本篇文章我們來詳細(xì)解釋常見Davlik字節(jié)碼2021-11-11Android開發(fā)學(xué)習(xí)筆記 淺談WebView
WebView(網(wǎng)絡(luò)視圖)能加載顯示網(wǎng)頁,可以將其視為一個(gè)瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁,實(shí)現(xiàn)WebView有以下兩種不同的方法2014-11-11Android圖片翻轉(zhuǎn)動(dòng)畫簡易實(shí)現(xiàn)代碼
Android圖片翻轉(zhuǎn)動(dòng)畫效果如何實(shí)現(xiàn),本文將給你一個(gè)驚喜,實(shí)現(xiàn)代碼已經(jīng)列出,需要的朋友可以參考下2012-11-11Android應(yīng)用中ListView利用OnScrollListener分頁加載數(shù)據(jù)
這篇文章主要介紹了Android應(yīng)用中ListView利用OnScrollListener分頁加載數(shù)據(jù)的方法,包括對(duì)OnScrollListener事件順序次數(shù)的分析,需要的朋友可以參考下2016-03-03Android開發(fā)中使用Intent打開第三方應(yīng)用及驗(yàn)證可用性的方法詳解
這篇文章主要介紹了Android開發(fā)中使用Intent打開第三方應(yīng)用及驗(yàn)證可用性的方法,結(jié)合實(shí)例形式分析了Android使用Intent打開第三方應(yīng)用的三種常用方式及使用注意事項(xiàng),需要的朋友可以參考下2017-11-11