Volley的使用(一)

HttpURLConnection和HttpClient大家一定并不陌生,面对这类原生的网络请求一定不少人觉得特别麻烦,如果封装不好的话一定会出现很多不必要的重复代码,但是大家不要怕,程序员的福音到了,在2013年Google I/O大会上推出了一个新的网络通信框架——Volley,虽说已经过去了将近三年的时间,但是Volley的使用还是频频出现在我们的开发之中,今天我就来带着大家一起看一看,如何使用Volley

既然我们要使用Volley,那么就一定要下载Volley的jar包喽,很简单,我最喜欢的方式就是在Android Studio中直接添,加快捷键commend+; 相信只要是导过jar包的同学都会用,搜索Volley就能找到啦
或者你可以直接添加依赖

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
    compile 'com.google.code.gson:gson:2.6.2'
}

这里我们直接把Gson的jar包也依赖上,一会儿使用它来解析我们获取的数据

Volley的使用真的是太简单了,首先我来介绍一下StringRequest

 //我们首先要获取到一个RequestQueue对象,
        RequestQueue requestQueue = Volley.newRequestQueue(this);

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

StringRequest stringRequest = new StringRequest("http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
               // Log.d("MainActivity", response);
                Gson gson = new Gson();
                Bean bean = gson.fromJson(response,Bean.class);
                for(Bean.EventsBean a : bean.getEvents()){
                Log.d("MainAtivity", a.getAdapt_url());

                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("MainActivity", "error:" + error);
            }
        });

最后,将这个StringRequest对象添加到RequestQueue里面就可以了

        requestQueue.add(stringRequest);

StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调,在这里我直接将获取到的数据进行解析并且打印出来.在日志中我就可以获得我想要的内容,前提是你的实体类已经写好了(实体类根据不同的数据也是不一样的我这里就不把我的实体类贴出来了)

介绍完了StringRequset 我们继续学习一下另一个Request——–JsontRequset
其实JsonRequset的使用和StringRequest的使用基本是一样的,它们都继承Request,但是由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest.
我以JsonObjectRequest为例贴出代码

        JsonObjectRequest request = new JsonObjectRequest("http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php", null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.d("++++++++++++", "response:" + response);
                Gson gson = new Gson();
                Bean bean = gson.fromJson(String.valueOf(response), Bean.class);
                for (Bean.EventsBean a : bean.getEvents()) {
                    Log.d("MainAtivity", a.getAdapt_url());

                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        requestQueue.add(request);

用法完全相同 只不过返回的是JSON格式的而已,然后我们解析数据就可以了,我的代码中已经将数据进行解析了.

我们已经学会了如何获取数据,是不是应该知道怎么获取网络图片了呢? 哈哈哈别急呦,我们现在就来学习一下.从名字上我们就能知道了ImageRequest,多么通俗易解得类名啊,那它到底怎么使用呢?
简单粗暴 直接上代码,

    RequestQueue requestQueue = Volley.newRequestQueue(this);
        ImageRequest imageRequest = new ImageRequest("http://pic10.nipic.com/20101020/3650425_202918301404_2.jpg",
                new com.android.volley.Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        iv.setImageBitmap(response);
                    }
                }, 0, 0, Bitmap.Config.ALPHA_8, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                iv.setImageResource(R.mipmap.ic_launcher);
            }

        });

    requestQueue.add(imageRequest);

如果你知道了如何使用Volley获取网络数据,那么你看这段代码应该一点问题也没有了,可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片.

是不是也非常简单呢,如果你觉得这么做很好的话,那么你就实在是太low了,Volley能做到的远不止这些,我们还有一个更加强大的ImageLoader,ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

我们来看一看如何用ImageLoader获取网络图片呢
由于ImageLoader已经不是继承自Request的了,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可以分为以下四步:

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 获取一个ImageListener对象。

  4. 调用ImageLoader的get()方法加载网络上的图片。

//ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象,这里我们先new出一个空的ImageCache的实现即可。
 ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {

            }
        });
        //ImageLoader的getImageListener()方法能够获取到一个ImageListener对象,getImageListener()方法接收三个参数,第一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
        //最后,调用ImageLoader的get()方法来加载图片
        imageLoader.get("http://pic10.nipic.com/20101020/3650425_202918301404_2.jpg",listener);

你以为这就完事了吗??? 你想的太简单了,你这辈子走过最长的两条路就是我的套路,前面都只是Volley的基本用法而已,先学这么多吧,免得你消化不良.

未完,我们待续……

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值