volley_volley源码 - CSDN
精华内容
参与话题
  • Android Volley完全解析(一),初识Volley的基本用法

    万次阅读 多人点赞 2016-10-19 00:24:45
    我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。...Android开发团队也是意识到了有必要将HTTP的通信操作再进行...Volley可是说是把AsyncHttpC

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095


    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


    介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码:

    git clone https://android.googlesource.com/platform/frameworks/volley

    下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://download.csdn.net/detail/sinyu890807/7152015 。


    新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。


    3. StringRequest的用法


    前面已经说过,Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:

    RequestQueue mQueue = Volley.newRequestQueue(context);

    注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。


    接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示:

    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);
    							}
    						});

    可以看到,这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。


    最后,将这个StringRequest对象添加到RequestQueue里面就可以了,如下所示:

    mQueue.add(stringRequest);

    另外,由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加如下权限:

    <uses-permission android:name="android.permission.INTERNET" />

    好了,就是这么简单,如果你现在运行一下程序,并发出这样一条HTTP请求,就会看到LogCat中会打印出如下图所示的数据。




    没错,百度返回给我们的就是这样一长串的HTML代码,虽然我们看起来会有些吃力,但是浏览器却可以轻松地对这段HTML代码进行解析,然后将百度的首页展现出来。

    这样的话,一个最基本的HTTP发送与响应的功能就完成了。你会发现根本还没写几行代码就轻易实现了这个功能,主要就是进行了以下三步操作:


    1. 创建一个RequestQueue对象。

    2. 创建一个StringRequest对象。

    3. 将StringRequest对象添加到RequestQueue里面。


    不过大家都知道,HTTP的请求类型通常有两种,GET和POST,刚才我们使用的明显是一个GET请求,那么如果想要发出一条POST请求应该怎么做呢?StringRequest中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:

    StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener);
    可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:
    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;
    	}
    };

    你可能会说,每次都这样用起来岂不是很累?连个设置POST参数的方法都没有。但是不要忘记,Volley是开源的,只要你愿意,你可以自由地在里面添加和修改任何的方法,轻松就能定制出一个属于你自己的Volley版本。


    4. JsonRequest的用法


    学完了最基本的StringRequest的用法,我们再来进阶学习一下JsonRequest的用法。类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。


    至于它们的用法也基本上没有什么特殊之处,先new出一个JsonObjectRequest对象,如下所示:

    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);
    			}
    		});
    可以看到,这里我们填写的URL地址是http://m.weather.com.cn/data/101010100.html,这是中国天气网提供的一个查询天气信息的接口,响应的数据就是以JSON格式返回的,然后我们在onResponse()方法中将返回的数据打印出来。


    最后再将这个JsonObjectRequest对象添加到RequestQueue里就可以了,如下所示:

    mQueue.add(jsonObjectRequest);

    这样当HTTP通信完成之后,服务器响应的天气信息就会回调到onResponse()方法中,并打印出来。现在运行一下程序,发出这样一条HTTP请求,就会看到LogCat中会打印出如下图所示的数据。




    由此可以看出,服务器返回给我们的数据确实是JSON格式的,并且onResponse()方法中携带的参数也正是一个JSONObject对象,之后只需要从JSONObject对象取出我们想要得到的那部分数据就可以了。


    你应该发现了吧,JsonObjectRequest的用法和StringRequest的用法基本上是完全一样的,Volley的易用之处也在这里体现出来了,会了一种就可以让你举一反三,因此关于JsonArrayRequest的用法相信已经不需要我再去讲解了吧。


    好了,关于Volley的基本用法就讲到这里,下篇文章中我会带领大家继续探究Volley。感兴趣的朋友请继续阅读Android Volley完全解析(二),使用Volley加载网络图片


    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

            

    展开全文
  • Volley简介 Volley的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕 下载 volleyGithub地址:...

    关于volley,英文可以的同学可以直接戳以下链接看官方文档
    https://developer.android.com/training/volley

    Volley简介

    Volley的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕

    下载

    Volley Github地址

    或者可以clone以下仓库地址

    git clone https://github.com/google/volley
    

    引入

    有两种方式:
    1、如果在上一步中得到了volley项目的源码,我们可以在自己的项目中把volley当一个module引入【关于如何引入module
    2、更简单的一种方式是在build.gradle中引入依赖【推荐这种方式】

    compile 'com.android.volley:volley:1.1.1'
    

    使用

    StringRequest的用法

    接下来我们看看如何发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:

    RequestQueue mQueue = Volley.newRequestQueue(context);
    

    注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了

    接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示:

            StringRequest stringRequest = new StringRequest("https://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);
                }
            });
    

    可以看到,这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。

    最后,将这个StringRequest对象添加到RequestQueue里面就可以了,如下所示:

    mQueue.add(stringRequest);
    

    AndroidManifest.xml中添加如下权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    注意:如果直接复制郭神的代码可能遇到的问题Volley使用问题:com.android.volley.ServerError

    ok了,运行程序试一下,LogCat中会打印出如下图所示的数据
    在这里插入图片描述
    百度返回给我们的就是这样一长串的HTML代码,虽然我们看起来会有些吃力,但是浏览器却可以轻松地对这段HTML代码进行解析,然后将百度的首页展现出来

    这样的话,一个最基本的HTTP发送与响应的功能就完成了,分三步:

    1. 创建一个RequestQueue对象。

    2. 创建一个StringRequest对象。

    3. 将StringRequest对象添加到RequestQueue里面。

    POST

    刚才是发了一个GET请求,想要发出一条POST请求应该怎么做呢?StringRequest中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:

    StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener);
    

    可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

    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;
    	}
    };
    

    你可能会说,每次都这样用起来岂不是很累?连个设置POST参数的方法都没有。但是不要忘记,Volley是开源的,只要你愿意,你可以自由地在里面添加和修改任何的方法,轻松就能定制出一个属于你自己的Volley版本。

    JsonRequest

    由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://www.tianqiapi.com/api/?version=v1",
                    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);
                }
            });
    

    请求的网址是一个查询天气信息的接口,响应的数据就是以JSON格式返回的,然后我们在onResponse()方法中将返回的数据打印出来。

    最后再将这个JsonObjectRequest对象添加到RequestQueue里就可以了,如下所示:

    mQueue.add(jsonObjectRequest);
    

    现在运行一下程序,发出这样一条HTTP请求,就会看到LogCat中会打印出如下图所示的数据:
    在这里插入图片描述
    由此可以看出,服务器返回给我们的数据确实是JSON格式的,并且onResponse()方法中携带的参数也正是一个JSONObject对象,之后只需要从JSONObject对象取出我们想要得到的那部分数据就可以了。
    例如,我们想获取获取天气的城市 可以这样写

    Log.d("TAG", response.getString("city"));
    

    那么日志就会输出

    TAG: 秦皇岛
    

    不会解析json的同学可以看这篇文章解析JSON数据

    有兴趣可以看下一篇Android Volley使用(二)使用Volley加载网络图片


    转自郭神博客
    http://blog.csdn.net/guolin_blog/article/details/17482095

    展开全文
  • volley.jar包(最新)亲测可用volley.jar包(最新)亲测可用volley.jar包(最新)亲测可用
  • Volley框架

    2019-04-17 20:19:28
    //创建一个类,继承Addlication public class MyApp extends Application { private static RequestQueue queue; @Override public void onCreate() { ... queue = Volley.newRequestQueue(getApplica...

    //创建一个类,继承Addlication
    public class MyApp extends Application {

    private static RequestQueue queue;
    @Override
    public void onCreate() {
        super.onCreate();
        queue = Volley.newRequestQueue(getApplicationContext());
    }
    public static RequestQueue getHttpQueue(){
        return queue;
    }
    

    }
    //在清单文件中调用MyApp类
    android:name=".volley.MyApp"

    //HttpVolley
    public class HttpVolley {

    private static HttpVolley httpVolley;
    private StringRequest stringRequest;
    
    public interface VolleyCallBack{
        void onSuccess(String data);
        void onFail(VolleyError error);
    }
    //网络判断
    public boolean isNet(Context context){
        if (context!=null){
            ConnectivityManager mConnectivityManager =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (networkInfo!=null){
                return networkInfo.isAvailable();
            }
        }
        return false;
    }
    //单例模式
    public static  synchronized HttpVolley getInstance(){
        if (httpVolley==null){
            httpVolley=new HttpVolley();
        }
        return httpVolley;
    }
    
    
    public void HttpVolleyGet(String url,final VolleyCallBack callBack){
        stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                callBack.onSuccess(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                callBack.onFail(error);
            }
        });
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        stringRequest.setTag("textPost");
        //将请求加入全局队列中
        MyApp.getHttpQueue().add(stringRequest);
    }
    //post请求
    public void HttpVolleyPost(String url, final Map<String,String> map,final VolleyCallBack callBack){
        stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                callBack.onSuccess(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                callBack.onFail(error);
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return map;
            }
        };
        stringRequest.setTag("textPost");
        MyApp.getHttpQueue().add(stringRequest);
    }
    

    }

    展开全文
  • Volley的基本使用

    2019-02-15 16:16:22
    Volley是Google在2003年的I/O大会上推出的通信框架,结合了AsyncHttpClient和Universal- Image-Loader的优点——简化了http的使用 + 异步加载图片的神奇能力。Android中的Http实现主要有HttpUrlConnection和HttpC...

    转载自:https://www.cnblogs.com/liu37130/p/3902390.html

    Volley是Google在2003年的I/O大会上推出的通信框架,结合了AsyncHttpClient和Universal- Image-Loader的优点——简化了http的使用 + 异步加载图片的神奇能力。Android中的Http实现主要有HttpUrlConnection和HttpClient两种,关于二者的选择 Google在Blog中表示推荐在姜饼小人(API level = 9)及以上的版本中使用Java的HttpUrlConnection而在之前的版本使用Apache的HttpClient,这在Volley这个框架 中也有明确的体现。

     

    获取Volley

    git clone https://android.googlesource.com/platform/frameworks/volley

    把它编译成jar文件就可以加入libs了

     

    一、简单的请求(以StringRequest为例)

      Http的通信最主要的部分应该就是发出请求和接收响应 了,所以Volley的比较核心的一个类就是RequestQueue,一个请求队列。它负责管理工作线程,读写缓存,和解析、分发响应(具体操作还是由 具体的类实现),即将发出的Http请求都会首先聚集在这里等待工作线程来实现请求。RequestQueue可以被看成一艘载满Http请求的航空母 舰,而工作线程就是弹射器喽。

      所以按照航母起飞飞机的步骤,我们可以猜到利用Volley进行Http通信的简单步骤:

        1.获取RequestQueue(得到一艘航母,可以是自己造的,也可以是委托别人造的,下面会提到)

        2.实例化一个Request(得到一架飞机,你也知道飞机又很多类型啦)

        3.将Request加入RequestQueue,等待工作线程将其发送出去(把飞机从机库升上起飞甲板,等待弹射器把它扔出去)

     

    起飞侦察机-发出GET请求

      按照上面的步骤,第一步就是建立一个请求队列,最简单的方法就是用Volley.newRequestQueue(),这是一个特别方便的 静态方法,替我们默认实现了所有需要的东西(网络、缓存等,这些在Volley中都有默认实现),它会返回一个已经开始运行的 RequestQueue(相当于别人帮忙造了艘航母)。之后我们需要的只是设置好请求的响应监听接口,把请求加入到这个队列中就可以等着响应数据来敲门 了。下面是Google文档中的示例代码:

     

    //初始化一个请求队列
      RequestQueue queue = Volley.newRequestQueue(this);
      String url ="http://www.google.com";
      
      //根据给定的URL新建一个请求
      StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                  new Response.Listener() {
          @Override
          public void onResponse(String response) {
             //在这里操作UI组件是安全的,因为响应返回时这个函数会被post到UI线程来执行
             // 在这里尽情蹂躏响应的String。
         }
     }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
             // 出错了怎么办?凉拌!并且在这里拌。
         }
    });
    // 把这个请求加入请求队列
    queue.add(stringRequest);

     

    StringRequest是Request的具体实现之一,代表解析后的响应数据是一个字符串,相似的还有JsonRequest(包括 JsonObjectRequest和JsonArrayRequest两个可以使用的子类)、ImageRequest来满足基本的使用,用法大同小 异。主要是构造参数不一样,分别如下:

      1.public StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener);     参数说明:从左到右分别是请求方法(都封装在Request中的Method接口内),请求URL,响应监听接口实例,错误监听接口实例。

      2.public JsonObjectRequest(int method, String url, JSONObject jsonRequest,Listener<JSONObject> listener, ErrorListener errorListener);

         public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,ErrorListener errorListener);

         参数说明:如果是GET请求的话,jsonRequest传入null就可以了,否则在未指明请求方法的情况下(也就是第二个构造函数)会默认为POST请求。其他同上。

      3.public JsonArrayRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener);

         参数说明:同上。

      4.public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig, Response.ErrorListener errorListener);

         参数说明:decodeConfig是图片的颜色属性,下面的几个值都可以使用。

     

    Bitmap.Config中的颜色属性(枚举类型)
    ALPHA_8  
    ARGB_4444 由于质量低,已经被弃用,推荐用ARGB_8888
    ARGB_8888 每个像素用4byte存储
    RGB_565 每个像素用2byte存储,红色占5位,绿色占6位,蓝色占5位

     

    起飞战斗机-发出POST请求

      基本方式和上面一样,但是怎么装导弹,啊不,是怎么提交的数据呢?

    Volley会在Request的请求方法是POST(还有PUT和PATCH)的情况下调用Request类(就是XXXRequest的父 类)的getParam()函数来获取参数,提前剧透,如果使用的是HttpUrlConnection的话,调用getParam()是在 HurlStatck中的addBodyIfExists()函数实现的,感兴趣的话可以去看一下哈。所以,POST请求像下面这样就可以了。

    //初始化一个请求队列
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://www.google.com";
    
    //根据给定的URL新建一个请求
    StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
       new Response.Listener() {
        @Override
        public void onResponse(String response) {
            // 在这里处理请求得到的String类型的响应
       }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // 在这里进行出错之后的处理
       }
    }) {
    @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
     };
    // 把这个请求加入请求队列
    queue.add(stringRequest);

     

     

    后悔药-取消请求

      Request中有一个cancel()方法,调用这个就可以取消当前请求了,但是取消到哪一个层次就不一定了,但是Volley可以保证 响应处理函数(就是onResponse()和onErroeResponse())不会被调用。还有一个一起取消多个请求,就是在发出请求前调用 Request的setTag()方法为每个请求加一个标签,这个方法的参数是Object,所以我们可以使用任何类型作为标签。这样就可以调用 ReqiestQueue的cancelAll()函数取消一群标签了。比较常用的方法就是,将发出这个请求的Activity或者Fragment作为 标签,并在onStop()中调用cancelAll()。

     

    二、使用ImageLoader加载图片

      ImageLoader 是一个可以实现图片异步加载的类,但已经不是继承与Request了。ImageLoader虽然是头神兽,但必须在主线程召唤它,否则会抛出错误 IllegalStateException,可能是因为ImageLoader在图片返回时要直接操作ImageView,在主线程里操作UI组件才是 安全的,so~

      用ImageLoader加载图片分三步

        1.创建ImageLoader

        2.获取一个ImageListener对象

        3.调用ImageLoader的get()方法获取图片

      ImageLoader的构造函数长成这样:public ImageLoader(RequestQueue queue, ImageCache imageCache);

    所以实例化一个ImageLoader需要一个RequestQueue(之前建立的就行),还有一个ImageCache,这是一个 ImageLoader内部定义的接口,用来实现L1缓存——内存缓存(Volley在RequestQueue中已经实现了L2缓存——文件缓存)。 ImageLoader中并没有对传入的ImageCache在使用前判空的代码,传null进去会出错的。如果实在不想弄内存缓存,实现一个什么都不做 的ImageCache就好了。下面是代码:

     

    ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageCache() {  
        @Override  
        public void putBitmap(String url, Bitmap bitmap) {  
        }  
      
        @Override  
        public Bitmap getBitmap(String url) {  
            return null;  
        }  
    });
    
    //default_image是正在加载图片时占位用的
    //error_image是加载不成功时显示的图片
    ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.error_image); 
    15imageLoader.get("your image url", listener);

     

      除了ImageLoader之外Volley中还有一个Image加载的神器——NetworkImageView,使用步骤如下:

        1.在布局文件中加入控件,并在Java代码中获取实例

        2.设置default_image,error_image,图片URL,一个ImageLoader对象

      代码如下:

    1 networkImageView = (NetworkImageView) findViewById(R.id.network_image_view); 
    2 networkImageView.setDefaultImageResId(R.drawable.default_image);  
    3 networkImageView.setErrorImageResId(R.drawable.error_image);
    4 networkImageView.setImageUrl("your image url", imageLoader);  

     

    三、Google推荐的用法

      上面就是Volley的基本用法了,但是如果一个App需要频繁的网络通信的话,建立多个RequestQueue是件很奇怪的事儿(谁会 因为临时有飞机要在海上起飞就去新建一艘航母呢,这得多有钱啊),所以Google推荐我们只实例化一个RequestQueue来应付频繁的Http通 信,当然,要保证队列的寿命和App一样长。如何实现呢?Google又说了,不推荐在App的Application.onCretae()方法中实例 化一个RequestQueue(不过确实是个简单的方法哈),最好是建立一个单例模式的类,并把所有我们需要用到的Volley的瓶瓶罐罐都放进去,这 样显得更模块化。下面就是示例代码。这段代码中最重要的就是RequestQueue要用Application的Context实例化,要不然就会随着 Activity的生命周期不停重建。其实,像AsyncHttpClient中的纯静态使用方法也不错(详情见:http://loopj.com /android-async-http/)

    PS:下面还实现了一个简单的ImageCache

     

    private static MySingleton mInstance;
        private RequestQueue mRequestQueue;
        private ImageLoader mImageLoader;
        private static Context mCtx;
    
        private MySingleton(Context context) {
            mCtx = 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 MySingleton getInstance(Context context) {
            if (mInstance == null) {
                mInstance = new MySingleton(context);
            }
            return mInstance;
        }
    
        public RequestQueue getRequestQueue() {
            if (mRequestQueue == null) {
                // getApplicationContext()是关键, 它会避免
                // Activity或者BroadcastReceiver带来的缺点.
                mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
            }
            return mRequestQueue;
        }
    
        public <T> void addToRequestQueue(Request<T> req) {
            getRequestQueue().add(req);
        }
    
        public ImageLoader getImageLoader() {
            return mImageLoader;
        }
    }

     

     

    四、Volley是怎么管理请求的呢?

      RequestQueue会维护一个缓存调度线程(cache线程)和一个网络调度线程池(net线程)(注意,这是一池子线程),当一个 Request被加到队列中的时候,cache线程会把这个请求进行筛选:如果这个请求的内容可以在缓存中找到,cache线程会亲自解析相应内容,并分 发到主线程(UI)。如果缓存中没有,这个request就会被加入到另一个NetworkQueue,所有真正准备进行网络通信的request都在这 里,第一个可用的net线程会从NetworkQueue中拿出一个request扔向服务器。当响应数据到的时候,这个net线程会解析原始响应数据, 写入缓存,并把解析后的结果返回给主线程。如下图:

     

    所以,读源码的话也可以把源码分成四层,如下图:(其余的类都可以归到“方便的工具类”中,比如ImageLoader,ClearCacheRequest等等)。

    展开全文
  • Volley 简单入门

    万次阅读 2019-04-09 12:14:36
    1、Volley简介 Volley是一个网络通信框架,在2013年的Google I/O被推出。 Volley是一个优秀的网路访问框架,即可以通过它访问普通的网络数据,如JSON格式的数据,也可以下载图片。 2、Volley的使用场景: ...
  • 安卓框架Volley介绍及简单使用

    千次阅读 2019-06-04 08:39:43
    安卓最热门框架Volley介绍及简单使用Volley简介使用方式导入使用字符数据的处理StringRequest 网络请求返回字符串JsonObjectRequest json格式的数据通信图片数据的处理ImageRequest 图片请求ImageLoader 更加强大的...
  • Android 网络通信框架Volley简介(Google IO 2013)

    万次阅读 多人点赞 2013-12-29 14:05:00
    1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley发布了。Volley是...
  • Android Volley.jar包下载

    万次阅读 2015-08-28 11:41:42
    Android Volley下载 Android Volley是Android平台上很好用的第三方开源网络通信框架。使用简答,功能强大。 现在我把Android Volley的库jar包Volley.jar放出来供大家下载使用,下载连接地址:...
  • See com.android.volley.Request.setRetryPolicy() and the constructor for DefaultRetryPolicy, e.g. 代码如下:myRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS,
  • android studio 导入volley

    千次阅读 2017-07-18 20:28:13
    Android library project 导入 volley
  • android studio volley compile添加依赖

    千次阅读 2016-08-09 12:03:50
    compile 'com.mcxiaoke.volley:library:1.0.19'
  • Github-volley jar包和源码

    千次下载 热门讨论 2020-07-30 23:32:19
    volley是一个优秀的安卓开源网络访问工具 这里包含一个volley代码jar和源码,版本是2015.03.03的1.0.11版本 更多资料可以参见volley的github地址: https://github.com/mcxiaoke/android-volley
  • 1.自定义request,继承com.android.volley.Request 2.构造方法实现(basecallback,为自定义的监听,实现Response.Listener,ErrorListener接口)--post请求 public BaseRequest(String url,String params, BaseC
  • OkHttp和Volley对比

    万次阅读 多人点赞 2016-08-11 14:22:43
    OkHttp物理质量使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)这2个jar包,总大小差不多400k,加上自己的封装,差不多得410k。功能介绍Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。...优点 支持ht
  • Android Studio使用Volley

    千次阅读 2016-08-27 16:16:20
    Android使用Volley我的Android Studio 版本 第一种方法添加volley到gradle依赖 第二种方法引入volley的jar包 引入jar包方法也有两种 引入jar包的第一种 引入jar包的第二种 第三种方法下载 volley项目添加为项目...
  • 添加VolleyVolley的简单用法 StringRequest和JsonObjectRequest Activity的退出的同时停止Volley网络请求 ImageRequest的使用 ImageLoader的使用 添加Volley库首先需要下载Volley的jar包或者自己编译Volley源码,...
  • volley带参数的post请求

    千次阅读 2015-12-21 21:07:57
    http://blog.csdn.net/onlysnail/article/details/47905375
  • 如题所示,安卓调用接口,网页访问都是正常,但是在安卓端就报这个错误,求解!
  • 在Android Studio中使用Volley框架,首先要导入Volley到项目中去。 点击主界面左上角File ,点击Project Structure ,在Modules下,点击app,然后点击Dependencies,然后点击右边的那个"+"号。如下图: ...
1 2 3 4 5 ... 20
收藏数 18,032
精华内容 7,212
关键字:

volley