Android開發(fā)中使用Volley庫發(fā)送HTTP請求的實(shí)例教程
Android Volley 是Google開發(fā)的一個(gè)網(wǎng)絡(luò)lib,可以讓你更加簡單并且快速的訪問網(wǎng)絡(luò)數(shù)據(jù)。Volley庫的網(wǎng)絡(luò)請求都是異步的,你不必?fù)?dān)心異步處理問題。
Volley的優(yōu)點(diǎn):
- 請求隊(duì)列和請求優(yōu)先級
- 請求Cache和內(nèi)存管理
- 擴(kuò)展性性強(qiá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è)請求隊(duì)列RequestQueue,使用請求隊(duì)列的最佳方式就是將它做成一個(gè)單例,整個(gè)app使用這么一個(gè)請求隊(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來存放請求的圖片:
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請求實(shí)例
private Context mContext;
private RequestQueue mRequestQueue;
private StringRequest mStringRequest;
// 利用Volley實(shí)現(xiàn)Post請求
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("請求結(jié)果:" + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("請求錯(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請求類提供了一個(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ù)請求
private void volley_json() {
mContext = this;
String url = "http://aplesson.com/data/101010100.html";
// 1 創(chuàng)建RequestQueue對象
mRequestQueue = Volley.newRequestQueue(mContext);
// 2 創(chuàng)建JsonObjectRequest對象
mJsonObjectRequest = new JsonObjectRequest(url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println("請求結(jié)果:" + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("請求錯(cuò)誤:" + error.toString());
}
});
// 3 將JsonObjectRequest添加到RequestQueue
mRequestQueue.add(mJsonObjectRequest);
}
// 利用Volley實(shí)現(xiàn)Get請求
private void volley_get() {
mContext = this;
String url = "http://www.aplesson.com/";
// 1 創(chuàng)建RequestQueue對象
mRequestQueue = Volley.newRequestQueue(mContext);
// 2 創(chuàng)建StringRequest對象
mStringRequest = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println("請求結(jié)果:" + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("請求錯(cuò)誤:" + error.toString());
}
});
// 3 將StringRequest添加到RequestQueue
mRequestQueue.add(mStringRequest);
}
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。JsonObjectRequest:返回JSON對象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數(shù)據(jù),更加靈活。
另外可以繼承Request<T>自定義Request。
取消Request
Activity里面啟動(dòng)了網(wǎng)絡(luò)請求,而在這個(gè)網(wǎng)絡(luò)請求還沒返回結(jié)果的時(shí)候,Activity被結(jié)束了,此時(shí)如果繼續(xù)使用其中的Context等,除了無辜的浪費(fèi)CPU,電池,網(wǎng)絡(luò)等資源,有可能還會導(dǎo)致程序crash,所以,我們需要處理這種一場情況。使用Volley的話,我們可以在Activity停止的時(shí)候,同時(shí)取消所有或部分未完成的網(wǎng)絡(luò)請求。Volley里所有的請求結(jié)果會返回給主進(jìn)程,如果在主進(jìn)程里取消了某些請求,則這些請求將不會被返回給主線程。Volley支持多種request取消方式。
可以針對某些個(gè)request做取消操作:
@Override
public void onStop() {
for (Request <?> req : mRequestQueue) {
req.cancel();
}
}
取消這個(gè)隊(duì)列里的所有請求:
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
mRequestQueue.cancelAll(this);
}
可以根據(jù)RequestFilter或者Tag來終止某些請求
@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ò)請求緩存
- Android Volley框架全面解析
- Android Volley框架使用方法詳解
- Android中Volley框架進(jìn)行請求網(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中TextView和ImageView實(shí)現(xiàn)傾斜效果
這篇文章主要為大家詳細(xì)介紹了Android中TextView和ImageView實(shí)現(xiàn)傾斜效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android使用Canvas對象實(shí)現(xiàn)刮刮樂效果
這篇文章主要介紹了Android使用Canvas對象實(shí)現(xiàn)刮刮樂效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
簡單掌握Android Widget桌面小部件的創(chuàng)建步驟
這篇文章主要介紹了簡單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術(shù)進(jìn)行開發(fā),需要的朋友可以參考下2016-03-03
Android中顯示GIF動(dòng)畫的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中顯示GIF動(dòng)畫的實(shí)現(xiàn)代碼,較為詳細(xì)的分析了Android調(diào)用GIF動(dòng)畫所涉及的頁面布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android懸浮窗屏蔽懸浮窗外部所有的點(diǎn)擊事件的實(shí)例代碼
這篇文章主要介紹了Android懸浮窗屏蔽懸浮窗外部所有的點(diǎn)擊事件實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
Android中RecyclerView實(shí)現(xiàn)簡單購物車功能
這篇文章主要為大家詳細(xì)介紹了Android中RecyclerView實(shí)現(xiàn)簡單購物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Android12四大組件之Activity生命周期變化詳解
雖然說我們天天都在使用Activity,但是你真的對Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個(gè),但是其實(shí)那只是默認(rèn)的情況。也就是說在其他情況下,Activity的生命周期可能不會是按照我們以前所知道的流程,本章著重講解Activity的生命周期變化2022-07-07

