Android Volley Google发布的一套用于网络通信的工具库
下载地址:git clone https://android.googlesource.com/platform/frameworks/volley
或 : https://github.com/mcxiaoke/android-volley
Volley 能作什么
Google 2013 I/O 大会上发布的一个网络通信库。处理一些网络方面的请求,如数据解析、下载显示图片。
· 数据处理:对网络请求获取的数据的处理。
· 图片加载:对网络图片的下载及显示。
使用步骤
使用权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
初始化请求队列
RequestQueue mRequestQueue = Volley.newRequestQueue(Context context);
网络请求数据处理
默认提供两种数据请求类型,一为StringRequest,一为JsonRequest
JsonRequest又分:
· JsonArrayRequest
JsonArrayRequest request = new JsonArrayRequest("url", new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) {//请求响应返回的JSONArray } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); mRequestQueue.add(request);
· JsonObjectRequest
JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) {//请求响应返回的JSONObject System.out.println(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("test4JsonObjectRequest - error"); } }); mRequestQueue.add(request);mRequestQueue.add(request); 将请求加入队列。 可以有很多个add 入队操作,然后start
mRequestQueue.start(); 启动请求
mRequestQueue.stop(); 停止请求
图片加载请求
· ImageRequest 加载图片
使用方式与上面的JsonRequest类似
private void requestByImageRequest(final ImageView imageView, String url) { ImageRequest imgRequest = new ImageRequest(url, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) {//下载成功后 imageView.setImageBitmap(bitmap); } }, imageView.getWidth(), imageView.getHeight(), Config.RGB_565, new ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { //下载出错 } }); mRequestQueue.add(imgRequest); mRequestQueue.start(); }
· ImageLoader 加载图片
private void requestByImageLoader(ImageView imageView, String url) { int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数 int mCacheSize = maxMemory / 8; //以1/8 用作缓存 final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) { @Override protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size if (android.os.Build.VERSION.SDK_INT >= 12) { return value.getByteCount(); //需要api >=12 , 总字节数 } else { return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行) api1 } } }; ImageCache imageCache = new ImageCache() { @Override public void putBitmap(String key, Bitmap value) { mLruImageCache.put(key, value); } @Override public Bitmap getBitmap(String key) { return mLruImageCache.get(key); } }; ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache); // ImageLoader.getImageListener的第二个参数是默认的图片resource id,请求的图片为空时设置 // 第三个参数是请求失败时候的资源id,可以指定为0 ImageListener listener = ImageLoader.getImageListener( imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete); mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap // ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap // Bitmap bitmap = imageContainer.getBitmap(); // String requestUrl = imageContainer.getRequestUrl(); }
ImageLoader 需要结合 ImageCache来进行构造。ImageCache是一个interface
ImageCache 的put/get Bitmap的方法 ,推荐使用LruCache来实现。
ImageListener 是一个interface,提供两个方法:onResponse(),onResponseError()
ImageLoader 图片加载流程:ImageLoader.get(url, listener),判断是否存在于cache中,如果有,则直接取出并在listener中显示;如果没有,则new
一个ImageRequest,加入到requestQueue中,将listener中相应的方法在ImageRequest中的Response.Listener中进行调用。
· NetworkImageView 加载图片
private void requestByNetworkImg(NetworkImageView imageView, String url) { final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) { @Override protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行) api1 } }; ImageCache imageCache = new ImageCache() { @Override public void putBitmap(String key, Bitmap value) { mImageCache.put(key, value); } @Override public Bitmap getBitmap(String key) { return mImageCache.get(key); } }; ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache); /* * seturl时,里面的实现是:有了ImageLoader,就能执行加载url-bitmap的操作 */ imageView.setDefaultImageResId(0); //默认图 imageView.setErrorImageResId(0); //错误图 imageView.setImageUrl(url, mImageLoader); }
这是一个继承自ImageView的自定义组件。
imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader);
结合了ImageLoader,内部调用ImageLoader.get()来实现图片的加载。
在ListView中的item使用NetworkImageView:
只需要new 一个ImageLoader对象。不同的item,set不同的URL即可。
因为在ImageLoader中会new不同的ImageRequest加到RequestQueue中执行下载。
自定义Request
/** * Volley adapter for JSON requests that will be parsed into Java objects by Gson. */ public class GsonObjectRequest<T> extends Request<T> { protected final Gson gson = new Gson(); protected final Class<T> clazz; protected final Map<String, String> headers; protected final Listener<T> listener; /** * Make a GET request and return a parsed object from JSON. * * @param url URL of the request to make * @param clazz Relevant class object, for Gson's reflection * @param headers Map of request headers */ public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers, Listener<T> listener, ErrorListener errorListener) { super(method, url, errorListener); this.clazz = clazz; this.headers = headers; this.listener = listener; } public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers, Listener<T> listener, ErrorListener errorListener) { this(Method.GET, url, clazz, headers, listener, errorListener); } @Override public Map<String, String> getHeaders() throws AuthFailureError { return headers != null ? headers : super.getHeaders(); } @Override protected void deliverResponse(T response) { listener.onResponse(response); } //将请求获取的json转成 用gson 转成了对应的对象 @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success( gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } }自定义Request,至少需要重写 parseNetworkResponse() 、deliverResponse()
其他说明
Volley 类中定义了磁盘缓存目录。
Request .cancel() ,可以取消一个请求。
Request .setTag(String tag),设置一个tag
RequestQueue .cancelAll(String tag),取消同一tag标识的Request
RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 需要取消的Request
示例:http://download.csdn.net/detail/jjwwmlp456/8176595
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。