Volley -- 基本用法
来源:互联网 发布:ipad专业视频剪辑软件 编辑:程序博客网 时间:2024/06/17 14:22
简介
Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
目的
- 本文针对Volley的4种Request以及ImageLoader和NetworkImageView的基本用法做简单的讲解
由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
StringRequest
- GET
// 一个Activity创建一个RequestQueue实例RequestQueue mQueue = Volley.newRequestQueue(context);// 默认请求方式为GET,Listener,ErrorListener是请求结果的监听接口,是在UI线程中运行的StringRequest stringRequest = new StringRequest("http://www.baidu.com", new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } });// 添加到请求队列中等待执行mQueue.add(stringRequest);
- POST
// 这里添加Method.POST并通过重写Request的getParams()方法添加请求参数StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("params1", "value1"); map.put("params2", "value2"); return map; } };mQueue.add(stringRequest);
- 可以看出,对于请求Volley已经相当不错的封装,沿着这个思路,或许我们可以在做个封装,这样就对每次请求都不用写大量重复的代码,如果你有好的封装想法,非常期待你的分享,这里我mark一下
JsonObjectRequest
- JsonObjectRequest的用法与StringRequest用法差不多
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); mQueue.add(jsonObjectRequest);
JsonArrayRequest
- JsonArrayRequest的用法与StringRequest用法差不多
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest("http://m.weather.com.cn/data/101010100.html", null, new Response.Listener<JsonArray>() { @Override public void onResponse(JsonArray response) { Log.d("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); mQueue.add(jsonArrayRequest);
ImageRequest
- ImageRequest构造函数有七个参数,分别是图片的url地址,请求成功监听接口,要将图片压缩后的宽度、高度,图片的缩放方式,图片的配置,请求错误的监听接口。
- 这里当传入图片的宽度、高度为0、0时,不会对图片进行压缩
- 在这个ImageRequest中,有平常开发时一些需要特别注意的知识点,就是关于图片的压缩缓存避免OOM的问题,关于Volley的图片处理我会另外写一篇博文记录下。
ImageRequest imageRequest = new ImageRequest( "http://developer.android.com/images/home/aw_dac.png", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); } }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { imageView.setImageResource(R.drawable.default_image); } });mQueue.add(imageRequest);
小结一下,上面已经已经列出Volley为我们封装好常用的4种请求,使用过程可总结为: 初始化RequestQueue -> 创建Request -> 添加到RequestQueue
ImageLoader
// 初始化ImageLoader,第一个参数为RequestQueue,第二个参数为图片缓存接口ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() { @Override public void putBitmap(String url, Bitmap bitmap) { } @Override public Bitmap getBitmap(String url) { return null; } }); // 根据imageview获取ImageListener,参数分别为ImageView,默认展示的图片,请求失败展示的图片ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image); // 通过imageloader加载图片//imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener); // 通过imageloader加载图片,参数分别为图片url,该图片的监听接口,图片的宽度,高度imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener, 200, 200);
- 上面的ImageCache只是一个接口,要真正实现图片的缓存需要自定义缓存策略存储BItmap对象。下面通过LruCache自定义图片缓存
public class BitmapCache implements ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { // 缓存最大内存为10MB int maxSize = 10 * 1024 * 1024; mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { return mCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { mCache.put(url, bitmap); } }
- 它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
说白了ImageLoader是对ImageRequest的封装,这里总结一下使用过程: 创建RequestQueue -> 创建ImageLoader -> 获取ImageListener -> 通过ImageLoader的get()开始加载图片
NetworkImageView
- NetworkImageView是一个继承自ImageView的自定义控件,下面看看其用法。
<!-- NetworkImageView 控件 --> <com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" />
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
ImageLoader ImageLoader = ...;// 设置NetworkImageView 图片资源networkImageView.setDefaultImageResId(R.drawable.default_image);networkImageView.setErrorImageResId(R.drawable.failed_image); networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageLoader);
可以看出NetworkImageView其实是对ImageView跟ImageLoader的封装,这样的封装真的需要慢慢体会理解,这里mark一下,哈哈,没事可以看看
这里图片的宽高是根据控件的宽高获取,如果把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。
光是用法来说,Volley确实是值得学习学习,这里总结一下NetworkImageView的使用过程:创建RequestQueue -> 在布局中定义NetworkImageView并获取控件 -> 创建一个ImageLoader -> 设置NetworkImageView要加载图片的url(还可以设置setErrorImageResId和setDefaultImageResId)
总结
- 最后少不了总结,上面已经讲了Volley的4种Request以及ImageLoader和NetworkImageView的基本用法,问一下自己会用了吗??
现在已经写了关系Volley源码分析的相关文章,有兴趣的博友可以去看看Volley – 源码分析 和Volley – 图片处理方式源码分析
接下来还写了一篇关于Volley的源码分析,分析有Volley请求的流程,缓存的策略,工作线程的执行分配,接口回调的机制,代码的封装等
1 0
- Android Volley 基本用法
- volley基本用法
- Volley的基本用法
- Volley -- 基本用法
- Volley的基本用法
- volley的基本用法
- Volley的基本用法
- Volley基本用法
- Android Volley的基本用法
- 初识Volley的基本用法
- Android Volley的基本用法
- Andorid--Volley(一)--基本用法
- 初识Volley的基本用法
- Android Volley的基本用法
- Volley(一), 基本用法
- 初识Volley的基本用法
- Android Volley的基本用法
- 初识Volley的基本用法
- 11.18-学习心得
- skynet的windows版本
- 对sublime的认识(2)
- AngularJS内置指令
- JIT - 即时编译
- Volley -- 基本用法
- ADS2014 Win7 64位破解
- MAC环境下Eclipse Android jni环境配置
- iOS 开发 之 创建你自已的 Framework
- RelativeLayout布局及属性
- python之socket实现简单的Each服务
- 【译】17个提升iOS开发效率的必用工具
- CentOS 6.4安装配置ldap
- python之多线程socket服务实现