集AsyncHttpClient和ImageLoader优点于一身,适合数据请求频繁但是数据量不大的网络请求框架。不适合大数据的请求,比如文件下载。
Volley请求三步:
1、创建一个RequestQueue对象
2、创建一个request(StringRequest -- 返回String、JsonReques -- 返回Jsont、ImageRequest -- 返回Bitmap图片),创建时需要参数--回调监听,请求成功后,会将返回结果回调
3、将调用RequestQueue对象的add方法,将request加入queue即可
注意:在进行post请求时,因为request没有提供设置参数的方法,但是Volley在执行网络请求的时候,会调用父类的getParameter方法获取参数,所以我们可以通过匿名对象的方式复写父类的getParameter方法,将参数提供给Volley
Volley中的ImageLoader的用法 --- 能够过滤重复链接:
1、创建一个RequestQueue对象
2、创建一个ImageLoader对象(需要将RequestQueue作为参数,另外传入一个ImageCache对象,做图片缓存,可以复写ImageCache中的方法,使用三级缓存对图片进行处理)
3、通过ImageLoader对象得到一个ImageListener对象(可以设置默认图片和加载失败的图片)
4、调用ImageLoader对象的get方法请求网络图片
自定义我们自己的Request
虽然Volley只提供了StringRequest、JsonRequest和ImageRequest三种返回方式的request,但是我们可以对Volley进行扩展,定义出我们自己的Request
我们可以定义出一个自己的Request继承Volley的Request类,因为Volley的Request是一个抽象类,所以我们需要复写它的两个方法--parseNetworkResponse和deliverResponse,其中parseNetWorkResponse方法是将请求到的数据转换成我们需要的数据后调用response.success方法返回到deliverResponse中,然后deliverResponse方法中调用回调将数据返回到我们调用的地方使用。
例子如下:
1. public class GsonRequest<T> extends Request<T> {
2.
3. private final Listener<T> mListener;
4.
5. private Gson mGson;
6.
7. private Class<T> mClass;
8.
9. public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener,
10. ErrorListener errorListener) {
11. super(method, url, errorListener);
12. mGson = new Gson();
13. mClass = clazz;
14. mListener = listener;
15. }
16.
17. public GsonRequest(String url, Class<T> clazz, Listener<T> listener,
18. ErrorListener errorListener) {
19. this(Method.GET, url, clazz, listener, errorListener);
20. }
21.
22. @Override
23. protected Response<T> parseNetworkResponse(NetworkResponse response) {
24. try {
25. String jsonString = new String(response.data,
26. HttpHeaderParser.parseCharset(response.headers));
27. return Response.success(mGson.fromJson(jsonString, mClass),
28. HttpHeaderParser.parseCacheHeaders(response));
29. } catch (UnsupportedEncodingException e) {
30. return Response.error(new ParseError(e));
31. }
32. }
33.
34. @Override
35. protected void deliverResponse(T response) {
36. mListener.onResponse(response);
37. }
38.
39. }
使用:其中Weather是根据json串自定义的bean类,我们的GosnRequest直接将Weather返回
1. GsonRequest<Weather> gsonRequest = new GsonRequest<Weather>(
2. "http://www.weather.com.cn/data/sk/101010100.html", Weather.class,
3. new Response.Listener<Weather>() {
4. @Override
5. public void onResponse(Weather weather) {
6. WeatherInfo weatherInfo = weather.getWeatherinfo();
7. Log.d("TAG", "city is " + weatherInfo.getCity());
8. Log.d("TAG", "temp is " + weatherInfo.getTemp());
9. Log.d("TAG", "time is " + weatherInfo.getTime());
10. }
11. }, new Response.ErrorListener() {
12. @Override
13. public void onErrorResponse(VolleyError error) {
14. Log.e("TAG", error.getMessage(), error);
15. }
16. });
17. mQueue.add(gsonRequest);