我們平時在開發(fā)Android應(yīng)用的時候不可避免地都需要用到網(wǎng)絡(luò)技術(shù)农猬,而多數(shù)情況下應(yīng)用程序都會使用HTTP協(xié)議來發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)醒串。Android系統(tǒng)中主要提供了兩種方式來進行HTTP通信,HttpURLConnection和HttpClient,幾乎在任何項目的代碼中我們都能看到這兩個類的身影,使用率非常高。
不過HttpURLConnection和HttpClient的用法還是稍微有些復(fù)雜的胆筒,如果不進行適當封裝的話,很容易就會寫出不少重復(fù)代碼诈豌。于是乎仆救,一些Android網(wǎng)絡(luò)通信框架也就應(yīng)運而生,比如說AsyncHttpClient矫渔,它把HTTP所有的通信細節(jié)全部封裝在了內(nèi)部派桩,我們只需要簡單調(diào)用幾行代碼就可以完成通信操作了。再比如Universal-Image-Loader蚌斩,它使得在界面上顯示網(wǎng)絡(luò)圖片的操作變得極度簡單铆惑,開發(fā)者不用關(guān)心如何從網(wǎng)絡(luò)上獲取圖片范嘱,也不用關(guān)心開啟線程、回收圖片資源等細節(jié)员魏,Universal-Image-Loader已經(jīng)把一切都做好了丑蛤。
Android開發(fā)團隊也是意識到了有必要將HTTP的通信操作再進行簡單化,于是在2013年Google I/O大會上推出了一個新的網(wǎng)絡(luò)通信框架——Volley撕阎。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點集于了一身受裹,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片虏束。除了簡單易用之外棉饶,Volley在性能方面也進行了大幅度的調(diào)整,它的設(shè)計目標就是非常適合去進行數(shù)據(jù)量不大镇匀,但通信頻繁的網(wǎng)絡(luò)操作照藻,而對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等汗侵,Volley的表現(xiàn)就會非常糟糕幸缕。
get請求
private voidget(){
RequestQueue rq= Volley.newRequestQueue(getApplicationContext());
StringRequest有三個參數(shù) ?一個是請求地址 ?一個是強求成功調(diào)用的方法,一個是請求失敗調(diào)用的方法
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("參數(shù)1","value1");
map.put("參數(shù)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的構(gòu)造函數(shù)接收六個參數(shù),第一個參數(shù)就是圖片的URL地址雪猪,這個沒什么需要解釋的栏尚。第二個參數(shù)是圖片請求成功的回調(diào),這里我們把返回的Bitmap參數(shù)設(shè)置到ImageView中只恨。第三第四個參數(shù)分別用于指定允許圖片最大的寬度和高度译仗,如果指定的網(wǎng)絡(luò)圖片的寬度或高度大于這里的最大值,則會對圖片進行壓縮坤次,指定成0的話就表示不管圖片有多大,都不會進行壓縮斥赋。第五個參數(shù)用于指定圖片的顏色屬性缰猴,Bitmap.Config下的幾個常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性疤剑,這里可以設(shè)置為null滑绒,每個圖片像素占據(jù)4個字節(jié)的大小,而RGB_565則表示每個圖片像素占據(jù)2個字節(jié)大小隘膘。第六個參數(shù)是圖片請求失敗的回調(diào)疑故,這里我們當請求失敗時在ImageView中顯示一張默認圖片。
加載網(wǎng)絡(luò)圖片并緩存
寫一個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);