Android Volley网络通信库学习
2015-08-25 10:27
627 查看
Volley
官网Google IO, Volley:
Easy, Fast Networking for Android PDF下载地址
设计目的
让网络更快,更简便,更健壮。适用场景
数据量不大且通信频繁。ListView显示图片,不必担心OOM。
不适用场景
较大负载数据(large payloads)流媒体
还需要使用原始的方法,比如Download Manager等。
版本要求
最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。Get请求
1.下载jar包,导入IDE;或者克隆仓库到本地,然后编译Jar包:[code]git clone https://android.googlesource.com/platform/frameworks/volley
2.创建一个请求队列
[code]RequestQueue mQueue = Volley.newRequestQueue(this);
3.创建一个StringRequest:表示将请求的数据转化为字符串返回(Volley自带仅支持String,Image,JsonObject,JsonArray,之后的文章我会介绍自定义请求的实现),然后我们为他设置listener、errorListener:
[code]// (int method, String url, Listener<String> listener, ErrorListener errorListener) StringRequest stringRequest = new StringRequest(Method.GET, "这里输入URL地址", new Listener<String>() { @Override public void onResponse(String response) { // 处理返回请求返回的结果 } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 请求出错,处理出错程序 } });
将请求加入请求队列中:请求队列允许同时添加多个请求,也就是说,我们一次性可以添加多个请求到请求队列中
[code]mQueue.add(stringRequest);
4.从网络取得JSON对象:
[code]mQueue = Volley.newRequestQueue(getApplicationContext()); mQueue.add(new JsonObjectRequest(Method.GET, url, null, new Listener() { @Override public void onResponse(JSONObject response) { Log.d(TAG, "response : " + response.toString()); } }, null)); mQueue.start();
Post
其他步骤与Get请求一致,在第二步创建Request的时候,我们只要将传入的第一个参数改为 Method.POST;如果有Post数据,我们需要重写getParams方法(观察过Volley源码的同学可以看到,源码中getParams函数返回的一个null,所以我们要重写该函数)
[code]StringRequest stringRequest = new StringRequest(Method.POST, "这里输入URL地址", new Listener<String>() { @Override public void onResponse(String response) { // 处理返回请求返回的结果 } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 请求出错,处理出错程序 } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { // 在这里设置需要post的参数 Map<String, String> params = new HashMap<String, String>(); params.put("key1", "value1"); params.put("key2", "value2"); return params; } };
图片加载缓存机制
1.创建一个请求队列:[code]RequestQueue mQueue = Volley.newRequestQueue(this)
图片缓存类:
[code]import android.graphics.Bitmap; import android.util.LruCache; import com.android.volley.toolbox.ImageLoader.ImageCache; class BitmapCache implements ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { // 缓存10M 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); } };
创建一个图片加载对象:
[code]ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
创建图片的监听器
[code]ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
第一个参数表示显示图片的控件,第二个参数表示加载图片时显示的图片,第三个参数表示出错时的图片显示。
加载图片到控件中:
[code]imageLoader.get("http://avatar.csdn.net/A/6/4/1_zhoumushui.jpg",listener);
ImageLoader的方法都需要从主线程里来调用。
NetworkImageView
com.android.volley.NetworkImageViewVolley提供了的一个新控件来代替传统的ImageView:
[code]mImageView.setImageUrl(url, imageLoader)
这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。
示例代码:
[code]mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache()); // ImageLoader构造函数的第二个参数是一个ImageCache的实例(严格来说,是实现ImageCache接口的某具体类的实例) ... ... if(holder.imageRequest != null) { holder.imageRequest.cancel(); } holder.imageRequest = mImageLoader.get(BASE_UR + item.image_url, holder.imageView, R.drawable.loading, R.drawable.error);
架构设计
如果在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,如果Activity被结束了,我们需要做以下处理:
[code]@Override public void onPostExecute(Result r) { if (getActivity() == null) { return; } // ... }
Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。
比如,可以针对某些个request做取消操作:
[code]@Override public void onStop() { for (Request <?> req : mInFlightRequests) { req.cancel(); } ... }
相关文章推荐
- 昆石VOS2009/VOS3000 2.1.6.00 新功能介绍
- 昆石VOS2009/VOS3000 2.1.6.00 操作指南
- CentOS 6.x 安装后设置及配置、网络、软件源、压缩、语言包、输入法
- (转载),方便使用http://www.cocoachina.com/bbs/read.php?tid=128244
- 揭秘谷歌网络基础设施十年演变过程
- HttpClient + PostMethod 发送post消息
- apache2 tomcat https配置-被忽悠进了CentOS 6
- TCP/IP网络协议栈(转载)
- [转]linux下iftop工具的安装与使用详解(图文)——实时的网络流量,监控TCP/IP连接(单机)
- http返回值
- 在Netty中支持https服务器
- 条件独立(conditional independence) 结合贝叶斯网络(Bayesian network) 概率有向图 (PRML8.2总结)
- 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)
- NSURLSession基本使用
- Android 网络通信框架Volley简介
- 2016网络红人萧天
- HTTP中的重定向和请求转发的区别
- TCP和UDP的"保护消息边界"
- Linux 下apache httpd进程老死
- iOS网络-06-监听Iphone的网络状态