Android Volley框架使用详解
来源:互联网 发布:淘宝上搜的血滴子是啥 编辑:程序博客网 时间:2024/04/24 11:00
简介
Volley是一个由Google官方推出的网络通信库,它使得Android进行网络请求时更加方便、快速、健壮,同时对网络图片加载也提供了良好的支持。
在此欢迎大家关注我的个人微信公众号AndroidSharer,分享软件开发相关技术包括Android、Java Web、HTML5以及产品研发干货,偶尔喝点鸡汤
volley使用
1、获取volley源码(需要翻墙访问)
$ git clone https://android.googlesource.com/platform/frameworks/volley$ cd volley$ android update project -p$ ant jar
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
将编译得到的jar包引入到我们的项目中;没有翻墙的同学可以通过网络搜索下载,也可以在此下载
http://download.csdn.net/detail/fenghai22/8472045
2、使用实例
使用Volley必须在AndroidManifest.xml中添加 android.permission.INTERNET权限,使用Volley时Google建议创建volley单例工具类
public class VolleySingleton { private static VolleySingleton volleySingleton; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private Context mContext; public VolleySingleton(Context context) { this.mContext = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache(){ private final LruCache<String,Bitmap> cache = new LruCache<String ,Bitmap>(20); @Override public Bitmap getBitmap(String url){ return cache.get(url); } @Override public void putBitmap(String url,Bitmap bitmap){ cache.put(url,bitmap); } }); } public static synchronized VolleySingleton getVolleySingleton(Context context){ if(volleySingleton == null){ volleySingleton = new VolleySingleton(context); } return volleySingleton; } public RequestQueue getRequestQueue(){ if(mRequestQueue == null){ mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req){ getRequestQueue().add(req); } public ImageLoader getImageLoader() { return mImageLoader; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
首先使用 Volley.newRequestQueue获取 RequestQueue对象
RequestQueue mRequestQueue = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getRequestQueue();
- 1
- 1
RequestQueue是请求队列对象,它可以缓存所有的HTTP网络请求,然后按照其内部算法并发的发送这些网络请求,它能够很好的支撑高并发请求,不要每个请求都创建RequestQueue对象,创建多个RequestQueue会耗费资源
发送StringRequest请求
StringRequest stringRequest = new StringRequest(Request.Method.GET,"https://www.baidu.com",new Listener<String>(){ @Override public void onResponse(String s) { //打印请求返回结果 Log.e("volley",s); } },new ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError) { Log.e("volleyerror","erro2"); } });//将StringRequest对象添加进RequestQueue请求队列中 VolleySingleton.getVolleySingleton(this.getApplicationContext()).addToRequestQueue(stringRequest);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
到此已经完成了StringRequest请求。StringRequest提供了两个构造方法
public StringRequest(java.lang.String url, com.android.volley.Response.Listener<java.lang.String> listener, com.android.volley.Response.ErrorListener errorListener);public StringRequest(int method, java.lang.String url, com.android.volley.Response.Listener<java.lang.String> listener, com.android.volley.Response.ErrorListener errorListener);
- 1
- 2
- 1
- 2
参数method是HTTP的请求类型,通常有GET和POST两种;参数url是请求地址;参数listener是服务器响应成功的回调,参数errorListener是服务器响应失败的回调。如果想通过POST方式请求并携带参数,遗憾的是StringRequest并没有提供带参数请求,但是当发送POST请求时,Volley会调用StringRequest的父类Request的getParams()方法来获取POST参数,所以我们只要使用StringRequest匿名类重写getParams()方法将参数传递进去就可以实现带参数的StringRequest请求。
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; } };
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
发送JsonObjectRequest请求
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>(){ @Override public void onResponse(JSONObject jsonObject) { Log.e("volley",jsonObject.toString()); } },new ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError) { Log.e("volleyerror","erro"); } }); VolleySingleton.getVolleySingleton(this.getApplicationContext()).addToRequestQueue(jr);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
JsonObjectRequest的构造方法参数和StringRequest一致,不在此累赘。
使用ImageRequest加载图片
ImageView mImageView;String url = "http://i.imgur.com/7spzG.png";mImageView = (ImageView) findViewById(R.id.myImage);ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) { mImageView.setImageBitmap(bitmap); } }, 0, 0, Config.RGB_565, new Response.ErrorListener() { public void onErrorResponse(VolleyError error) { mImageView.setImageResource(R.drawable.image_load_error); } }); VolleySingleton.getVolleySingleton(this.getApplicationContext()).addToRequestQueue(request);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
ImageRequest的构造函数
public ImageRequest(java.lang.String url, com.android.volley.Response.Listener<android.graphics.Bitmap> listener, int maxWidth, int maxHeight, android.graphics.Bitmap.Config decodeConfig, com.android.volley.Response.ErrorListener errorListener) { /* compiled code */ }
- 1
- 1
参数url是图片地址,参数listener是请求响应成功回调,参数maxWidth是图片最大宽度,参数maxHeight是图片最大高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。参数decodeConfig是图片的颜色属性,其值是Bitmap.Config类的几个常量,参数errorListener是请求响应失败回调
使用 ImageLoader 加载图片
ImageLoader mImageLoader;ImageView mImageView;private static final String IMAGE_URL = "http://developer.android.com/images/training/system-ui.png";mImageView = (ImageView) findViewById(R.id.regularImageView);mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();//IMAGE_URL是图片网络地址//mImageView是ImageView实例//R.drawable.def_image默认图片id//R.drawable.err_image加载图片错误时的图片mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView, R.drawable.def_image, R.drawable.err_image));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
使用NetworkImageView加载图片
XML布局文件
<com.android.volley.toolbox.NetworkImageView android:id="@+id/networkImageView" android:layout_width="150dp" android:layout_height="170dp" android:layout_centerHorizontal="true" />
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
ImageLoader mImageLoader;NetworkImageView mNetworkImageView;private static final String IMAGE_URL = "http://developer.android.com/images/training/system-ui.png";mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
我们可以调用它的setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法来分别设置加载中显示的图片,加载失败时显示的图片
取消网络请求
Volley还提供了取消网络请求的方法并且可以联动Activity的生命周期,比如在Activity的onStop()方法中调用cance()方法取消网络请求。
public static final String TAG = "MyTag";StringRequest stringRequest; // Assume this exists.RequestQueue mRequestQueue; // Assume this exists.// Set the tag on the request.stringRequest.setTag(TAG);// Add the request to the RequestQueue.mRequestQueue.add(stringRequest);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Activity的onStop()方法
@Overrideprotected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
响应广大博友的需求,特此放出源码:点击下载实例源码
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android Volley框架使用详解
- Android-网络通信框架Volley使用详解
- Android-网络通信框架Volley使用详解
- Android-网络通信框架Volley使用详解
- Android-网络通信框架Volley使用详解
- Android Volley框架详解
- android Volley 框架详解
- android 框架 volley 详解
- Android Volley框架使用
- 【Android 基础】Android热门网络框架使用详解-Volley
- Android HTTP框架Volley详解
- Android Volley框架使用方法详解
- Html 5 新特性之本地存储
- LeetCode 14. Longest Common Prefix
- iOS Concurrency (Swift) 二
- mysql 主从复制部署
- 2016阿里云121款产品和解决方案全向图(9月制)
- Android Volley框架使用详解
- 横向堆栈效果
- 享元模式——对象结构型模式
- eclipse怎样修改包(package)的显示样式、格式?
- select动态绑定vue.js
- gl常用函数简介
- js中的跨域问题
- IOS 圆角的几种形式
- 轮子怎么造----KyLog