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

响应广大博友的需求,特此放出源码:点击下载实例源码

0 0
原创粉丝点击