在網上看了寫Volley網絡訪問,自己做了下總結
一使用Volley進行網絡訪問請求
StringRequest的用法
1、首先需要獲取到一個RequestQueue(請求隊列對象)對象,可以調用如下方法獲取到:
RequestQueue mQueue = Volley.newRequestQueue(context);
2、創建一個StringRequest對象
get請求:
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
//請求成功的回調
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
},
//請求失敗的回調
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}});
post請求
//獲取RequestQueue對象
RequestQueue mQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(
//請求的方式
Request.Method.POST
//請求的url
, musicUrl,
//請求成功的回調
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("sucess", response);
}
}, //請求失敗的回調
new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("error", volleyError.getMessage(), volleyError);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> param = new HashMap<>();
param.put("showapi_appid","17767");
param.put("showapi_timestamp",getDate());
param.put("showapi_sign",musicSign);
param.put("topid","5");
return param;
}
};
最後將StringRequest添加到RequestQueue請求隊列
mQueue.add(stringRequest);
請求網絡主要以下三步
1. 創建一個RequestQueue對象。
2. 創建一個StringRequest對象。
3. 將StringRequest對象添加到RequestQueue裏面。
二、使用Volley進行加載圖片
1、是一個ImageRequest進行加載圖片
RequestQueue mQueue = Volley.newRequestQueue(context);
ImageRequest imageRequest = new ImageRequest( "http://developer.android.com/images/home/aw_dac.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
} }, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { imageView.setImageResource(R.drawable.default_image);
} });
ImageRequest的構造函數接收六個參數,第一個參數就是圖片的URL地址,這個沒什麼需要解釋的。
第二個參數是圖片請求成功的回調,這裏我們把返回的Bitmap參數設置到ImageView中。
第三第四個參數分別用於指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大於這裏的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。
第五個參數用於指定圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這裏使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片像素佔據4個字節的大小,而RGB_565則表示每個圖片像素佔據2個字節大小。
第六個參數是圖片請求失敗的回調,這裏我們當請求失敗時在ImageView中顯示一張默認圖片。
最後將這個ImageRequest對象添加到RequestQueue
2、使用ImageLoader進行加載圖片主要分爲以下四步
1. 創建一個RequestQueue對象。
2. 創建一個ImageLoader對象。
3. 獲取一個ImageListener對象。
4. 調用ImageLoader的get()方法加載網絡上的圖片。
創建RequestQueue對象沒變
RequestQueue mQueue = Volley.newRequestQueue(context);
創建ImageLoader
ImageLoader imageLoader = new ImageLoader(mQueue,
new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
} });
第一個參數就是RequestQueue對象,第二個參數是一個ImageCache對象,這裏我們先new出一個空的ImageCache的實現即可。
接下來需要獲取一個ImageListener對象
ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image);
通過調用ImageLoader的getImageListener()方法能夠獲取到一個ImageListener對象,getImageListener()方法接收三個參數,第一個參數指定用於顯示圖片的ImageView控件,第二個參數指定加載圖片的過程中顯示的圖片,第三個參數指定加載圖片失敗的情況下顯示的圖片。
最後通過調用ImageLoader的get()方法來加載圖片
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
get()方法接收兩個參數,第一個參數就是圖片的URL地址,
第二個參數則是剛剛獲取到的ImageListener對象。
當然,如果你想對圖片的大小進行限制,也可以使用get()方法的重載,
指定圖片允許的最大寬度和高度,如下所示:
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
listener, 200, 200);
如果需要圖片緩存的需要BitmapCache如:
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) { return mCache.get(url); } @Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
將緩存圖片的大小設置爲10M。接着修改創建ImageLoader實例的代碼,第二個參數傳入BitmapCache的實例
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
3、使用NetworkImageView組件進行加載圖片
Volley還提供了第三種方式來加載網絡圖片,即使用NetworkImageView。不同於以上兩種方式,NetworkImageView是一個自定義控制,它是繼承自ImageView的,具備ImageView控件的所有功能,並且在原生的基礎之上加入了加載網絡圖片的功能。NetworkImageView控件的用法要比前兩種方式更加簡單,大致可以分爲以下五步:
1. 創建一個RequestQueue對象。
2. 創建一個ImageLoader對象。
3. 在佈局文件中添加一個NetworkImageView控件。
4. 在代碼中獲取該控件的實例。
5. 設置要加載的圖片地址。
用法
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",imageLoader);
NetworkImageView並不需要提供任何設置最大寬高的方法也能夠對加載的圖片進行壓縮。這是由於NetworkImageView是一個控件,在加載圖片的時候它會自動獲取自身的寬高,然後對比網絡圖片的寬度,再決定是否需要對圖片進行壓縮。也就是說,壓縮過程是在內部完全自動化的,並不需要我們關心,NetworkImageView會始終呈現給我們一張大小剛剛好的網絡圖片,不會多佔用任何一點內存,這也是NetworkImageView最簡單好用的一點吧。
當然了,如果你不想對圖片進行壓縮的話,其實也很簡單,只需要在佈局文件中把NetworkImageView的layout_width和layout_height都設置成wrap_content就可以了,這樣NetworkImageView就會將該圖片的原始大小展示出來,不會進行任何壓縮。
4、使用DisplayImageOptions進行加載圖片
ImageLoader mImageLoader= ImageLoader.getInstance();
DisplayImageOptions mDisplayOtion=newDisplayImageOptions.Builder()
. showStubImage(R.drawable.detail_img_default)
.showImageForEmptyUri(R.drawable.detail_img_default)
.showImageOnFail(R.drawable.detail_img_default)
.cacheInMemory(true).cacheOnDisc (true)
.bitmapConfig(Bitmap.Config.RGB_565).build();
mImageLoader.displayImage(imgUrl,ImageView,mDisplayOtion);
因爲Volley進行圖片加載時感覺都很繁瑣,所以使用universal-image-loader-1.9.3.jar這個包進行加載圖片,減去中間的繁瑣代碼。