Volley
- 谷歌出品
- 底层使用HttpUrlConnection,可以兼容OkHttp
- 适合数据量不大,但是通信频繁的操作,可以用作加载图片,但下载文件什么的就不适合了
使用方法
Module build.gradle引入依赖:
dependencies {
compile 'com.android.volley:volley:1.0.0'
}
或者
git clone https://android.googlesource.com/platform/frameworks/volley
下载源码编译jar
基本使用步骤
- 创建RequestQueue
- 创建Request
- 将Request添加到RequestQueue
创建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中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数
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是一个抽象类,我们无法直接创建它的实例。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
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());
}
});
第一个参数就是图片的URL地址。第二个参数是图片请求成功的回调。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,可以放一张默认的图片。
ImageLoader
ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
使用步骤
- 创建RequestQueue
- 创建ImageLoader
- 获取ImageListener
- 调用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的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象。getImageListener()方法接收三个参数,第一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
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是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能。
使用步骤
- 创建RequestQueue
- 创建ImageLoader
- 布局文件中添加NetworkImageView控件,在代码中获取该控件的实例
- 设置要加载的图片地址
networkImageView.setDefaultImageResId(R.drawable.icon_placeholder);
networkImageView.setErrorImageResId(R.drawable.icon_failure);
networkImageView.setImageUrl(imageUrl, imageLoader);
setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法来分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址。
NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。
自定义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完全解析(一),初识Volley的基本用法
Android Volley完全解析(二),使用Volley加载网络图片
Android Volley完全解析(三),定制自己的Request