android volley使用技巧
来源:互联网 发布:.net和java 编辑:程序博客网 时间:2024/05/17 03:36
1. Volley简介
我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。
2. 下载Volley
下载地址:git clone https://android.googlesource.com/platform/frameworks/volley
或 : https://github.com/mcxiaoke/android-volley
3. StringRequest的用法
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.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));
- }
- }
- }
其他说明
Volley 类中定义了磁盘缓存目录。
Request .cancel() ,可以取消一个请求。
Request .setTag(String tag),设置一个tag
RequestQueue .cancelAll(String tag),取消同一tag标识的Request
RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 需要取消的Request
- android volley使用技巧
- Android网络通信框架Volley使用技巧汇总(一)
- Android网络通信框架Volley使用技巧汇总(二)
- Volley使用技巧-----自定义Request
- Android,Volley使用介绍
- Android Volley框架使用
- android volley 使用
- Android Volley的使用
- android volley的使用
- Android Studio使用Volley
- Android Volley基本使用
- Android之Volley使用
- Android Volley,使用Volley加载网络图片
- Android Volley使用之一:Volley基础用法
- Android Volley 使用Volley加载网络图片
- Android Volley框架使用详解
- android---Volley库的使用
- Android 使用OkHttp扩展Volley
- 如何通过TcpClient取得remote ip和port
- Android UI线程和非UI线程
- HTML5技术学习总结
- 类访问权限
- vim常用命令
- android volley使用技巧
- myeclipse快捷键
- 贪心:POJ2376
- iOS 多个按钮,选中其中一个其他按钮不可选
- Mac终端配置你的svn,甩掉subversi…
- 让你的Xcode6.1找回空白模板
- Cocos2d-x::批处理及引擎介绍
- Cocos2d-x::节点、精灵、布景层
- Cocos2d-x::坐标系、定时器、菜单