Volley
- 谷歌出品
- 底層使用HttpUrlConnection雷激,可以兼容OkHttp
- 適合數(shù)據(jù)量不大璧疗,但是通信頻繁的操作皆的,可以用作加載圖片悲敷,但下載文件什么的就不適合了
使用方法
Module build.gradle引入依賴:
dependencies {
compile 'com.android.volley:volley:1.0.0'
}
或者
git clone https://android.googlesource.com/platform/frameworks/volley
下載源碼編譯jar
基本使用步驟
- 創(chuàng)建RequestQueue
- 創(chuàng)建Request
- 將Request添加到RequestQueue
創(chuàng)建RequestQueue
RequestQueue mRequestQueue = Volley.newRequestQueue(context);
StringRequest
GET
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText(error.getLocalizedMessage());
}
});
POST
StringRequest中并沒(méi)有提供設(shè)置POST參數(shù)的方法究恤,但是當(dāng)發(fā)出POST請(qǐng)求的時(shí)候,Volley會(huì)嘗試調(diào)用StringRequest的父類——Request中的getParams()方法來(lái)獲取POST參數(shù)
StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};
將Request添加到RequestQueue
mRequestQueue.add(stringRequest);
JsonRequest
JsonRequest是一個(gè)抽象類后德,我們無(wú)法直接創(chuàng)建它的實(shí)例部宿。JsonRequest有兩個(gè)直接的子類,JsonObjectRequest和JsonArrayRequest瓢湃,一個(gè)是用于請(qǐng)求一段JSON數(shù)據(jù)的理张,一個(gè)是用于請(qǐng)求一段JSON數(shù)組的。
String jsonUrl = "http://www.weather.com.cn/adat/sk/101010100.html";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(jsonUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
textView.setText(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText(error.getLocalizedMessage());
}
});
mRequestQueue.add(jsonObjectRequest);
ImageRequest
ImageRequest imageRequest = new ImageRequest(imageUrl, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText(error.getLocalizedMessage());
}
});
第一個(gè)參數(shù)就是圖片的URL地址绵患。第二個(gè)參數(shù)是圖片請(qǐng)求成功的回調(diào)雾叭。第三第四個(gè)參數(shù)分別用于指定允許圖片最大的寬度和高度,如果指定的網(wǎng)絡(luò)圖片的寬度或高度大于這里的最大值落蝙,則會(huì)對(duì)圖片進(jìn)行壓縮织狐,指定成0的話就表示不管圖片有多大,都不會(huì)進(jìn)行壓縮掘殴。第五個(gè)參數(shù)用于指定圖片的顏色屬性赚瘦,Bitmap.Config下的幾個(gè)常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性奏寨,每個(gè)圖片像素占據(jù)4個(gè)字節(jié)的大小起意,而RGB_565則表示每個(gè)圖片像素占據(jù)2個(gè)字節(jié)大小。第六個(gè)參數(shù)是圖片請(qǐng)求失敗的回調(diào)病瞳,可以放一張默認(rèn)的圖片揽咕。
ImageLoader
ImageLoader也可以用于加載網(wǎng)絡(luò)上的圖片,并且它的內(nèi)部也是使用ImageRequest來(lái)實(shí)現(xiàn)的套菜,不過(guò)ImageLoader明顯要比ImageRequest更加高效亲善,因?yàn)樗粌H可以幫我們對(duì)圖片進(jìn)行緩存,還可以過(guò)濾掉重復(fù)的鏈接逗柴,避免重復(fù)發(fā)送請(qǐng)求蛹头。
使用步驟
- 創(chuàng)建RequestQueue
- 創(chuàng)建ImageLoader
- 獲取ImageListener
- 調(diào)用ImageLoader的get()方法
ImageLoader imageLoader = new ImageLoader(mRequestQueue, new BitmapCache());
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView, R.drawable.icon_placeholder, R.drawable.icon_failure);
imageLoader.get(imageUrl, imageListener);
//imageLoader.get(imageUrl, imageListener, 200, 200); //限制圖片寬高
ImageLoader的構(gòu)造函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)就是RequestQueue對(duì)象戏溺,第二個(gè)參數(shù)是一個(gè)ImageCache對(duì)象渣蜗。getImageListener()方法接收三個(gè)參數(shù),第一個(gè)參數(shù)指定用于顯示圖片的ImageView控件旷祸,第二個(gè)參數(shù)指定加載圖片的過(guò)程中顯示的圖片耕拷,第三個(gè)參數(shù)指定加載圖片失敗的情況下顯示的圖片。
BitmapCache:
public class BitmapCache implements ImageLoader.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 value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
NetworkImageView
NetworkImageView是一個(gè)自定義控制托享,它是繼承自ImageView的骚烧,具備ImageView控件的所有功能浸赫。
使用步驟
- 創(chuàng)建RequestQueue
- 創(chuàng)建ImageLoader
- 布局文件中添加NetworkImageView控件,在代碼中獲取該控件的實(shí)例
- 設(shè)置要加載的圖片地址
networkImageView.setDefaultImageResId(R.drawable.icon_placeholder);
networkImageView.setErrorImageResId(R.drawable.icon_failure);
networkImageView.setImageUrl(imageUrl, imageLoader);
setDefaultImageResId()方法赃绊、setErrorImageResId()方法和setImageUrl()方法來(lái)分別設(shè)置加載中顯示的圖片既峡,加載失敗時(shí)顯示的圖片,以及目標(biāo)圖片的URL地址凭戴。
NetworkImageView并不需要提供任何設(shè)置最大寬高的方法也能夠?qū)虞d的圖片進(jìn)行壓縮涧狮。
自定義Request
XMLRequest
public class XMLRequest extends Request<XmlPullParser> {
private final Response.Listener<XmlPullParser> mListener;
public XMLRequest(String url, Response.Listener<XmlPullParser> listener, Response.ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
public XMLRequest(int method, String url, Response.Listener<XmlPullParser> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException | XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}
}
GsonRequest
public class GsonRequest<T> extends Request<T> {
private Class<T> mClass;
private final Response.Listener<T> mListener;
private Gson mGson;
public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener, Response.ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}
public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
mClass = clazz;
mGson = new Gson();
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new VolleyError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
參考鏈接
Android Volley完全解析(一),初識(shí)Volley的基本用法
Android Volley完全解析(二)么夫,使用Volley加載網(wǎng)絡(luò)圖片
Android Volley完全解析(三)者冤,定制自己的Request