android Volley網絡請求框架使用

我們平時在開發Android應用的時候不可避免地都需要用到網絡技術,而多數情況下應用程序都會使用HTTP協議來發送和接收網絡數據。Android系統中主要提供了兩種方式來進行HTTP通信,HttpURLConnection和HttpClient,幾乎在任何項目的代碼中我們都能看到這兩個類的身影,使用率非常高。

不過HttpURLConnection和HttpClient的用法還是稍微有些復雜的,如果不進行適當封裝的話,很容易就會寫出不少重復代碼。于是乎,一些Android網絡通信框架也就應運而生,比如說AsyncHttpClient,它把HTTP所有的通信細節全部封裝在了內部,我們只需要簡單調用幾行代碼就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上顯示網絡圖片的操作變得極度簡單,開發者不用關心如何從網絡上獲取圖片,也不用關心開啟線程、回收圖片資源等細節,Universal-Image-Loader已經把一切都做好了。

Android開發團隊也是意識到了有必要將HTTP的通信操作再進行簡單化,于是在2013年Google I/O大會上推出了一個新的網絡通信框架——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖片。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目標就是非常適合去進行數據量不大,但通信頻繁的網絡操作,而對于大數據量的網絡操作,比如說下載文件等,Volley的表現就會非常糟糕。

get請求

private voidget(){

RequestQueue rq= Volley.newRequestQueue(getApplicationContext());

StringRequest有三個參數 ?一個是請求地址 ?一個是強求成功調用的方法,一個是請求失敗調用的方法

StringRequest sr=new StringRequest(url, newResponse.Listener() {

@Override

public voidonResponse(String s) { ? ?textView.setText(s.toString()); ? }

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {}

});

rq.add(sr);

}


POST方法

RequestQueue rq= Volley.newRequestQueue(getApplicationContext());

StringRequest stringRequest =newStringRequest(Request.Method.POST,url, newResponse.Listener() {

@Override

public voidonResponse(String s) {

}

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {

}

}) {

@Override

protectedMapgetParams()throwsAuthFailureError {

Map map =newHashMap();

map.put("參數1","value1");

map.put("參數2","value2");

returnmap;

}

};

rq.add(stringRequest);

}

用Volley加載圖片,使用這么一個方法

private voidimage(){

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());

ImageRequest imageRequest =newImageRequest(

"http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",

newResponse.Listener() {

@Override

public voidonResponse(Bitmap response) {

imageView.setImageBitmap(response);

}

},0,0,Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError error) {

imageView.setImageResource(R.mipmap.ic_launcher);

}

});

mQueue.add(imageRequest);

}

可以看到,ImageRequest的構造函數接收六個參數,第一個參數就是圖片的URL地址,這個沒什么需要解釋的。第二個參數是圖片請求成功的回調,這里我們把返回的Bitmap參數設置到ImageView中。第三第四個參數分別用于指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大于這里的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。第五個參數用于指定圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性,這里可以設置為null,每個圖片像素占據4個字節的大小,而RGB_565則表示每個圖片像素占據2個字節大小。第六個參數是圖片請求失敗的回調,這里我們當請求失敗時在ImageView中顯示一張默認圖片。

加載網絡圖片并緩存

寫一個ImageCache起到圖片緩存的作用

public classBitmapCacheimplementsImageLoader.ImageCache {

privateLruCachemCache;

publicBitmapCache() {

intmaxSize =10*1024*1024; ?//這個是緩存大小 ? ?10M

mCache=newLruCache(maxSize) {

@Override

protected intsizeOf(String key,Bitmap bitmap) {

returnbitmap.getRowBytes() * bitmap.getHeight();

}

};

}

@Override

publicBitmapgetBitmap(String url) {

returnmCache.get(url);

}

@Override

public voidputBitmap(String url,Bitmap bitmap) {

mCache.put(url,bitmap);

}

}

這樣我們就可以用這個類進行緩存圖片 ?接下來進行緩存

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());

ImageLoader imageLoader =newImageLoader(mQueue, newBitmapCache());

ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,

R.mipmap.ic_launcher,R.mipmap.ic_launcher_round);

imageLoader.get("http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",listener);

//imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener, 200, 200);


加載圖片參考

網絡請求加載參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容