Volley框架进行请求网络数据的使用

问题的阐述:Android SDK中的HttpClient和HttpUrlConnection两种请求方式用来处理网络的复杂的操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;

解决:Volley就是为解决这些而生,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。

Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕

这里写图片描述

1、Volley到底有哪些特点呢?

  1. 自动调度网络请求
  2. 多个并发的网络连接
  3. 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
  4. 支持请求优先级
  5. 支持取消请求的强大API,可以取消单个请求或多个
  6. 易于定制
  7. 健壮性:便于正确的更新UI和获取数据
  8. 包含调试和追踪工具

2、Volley中的RequestQueue 和 Request
● RequestQueue 用来执行请求的请求队列
● Request 用来构造一个请求对象
● Request对象主要有以下几种类型:
a. StringRequest 响应的主体为字符串
b. JsonArrayRequest 发送和接收JSON数组
c. JsonObjectRequest 发送和接收JSON对象
d. ImageRequest 发送和接收Image

3、Volley的使用步骤:
(1)创建一个Android项目,并导入volley的jar包

这里写图片描述

(2)GET的请求方式:

    //创建RequestQueue对象
                RequestQueue requestQueue = Volley.newRequestQueue(this);
                String url="http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android";
                //创建request对象
                StringRequest request=new StringRequest(url, new Response.Listener<String>() {

                    /**
                     * 请求成功的结果
                     * @param response  这个参数就是访问网络数据的结果
                     */
                    @Override
                    public void onResponse(String response) {
        //          
                    }


                }, new Response.ErrorListener() {

                    /**
                     * 这个方法用来监听访问错误,展示的结果
                     * 07-19 04:17:13.414: E/tag(1181): -------------
                     * com.android.volley.VolleyError: 
                     * java.lang.SecurityException: 
                     * Permission denied (missing INTERNET permission?)==========================

                     */

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("tag","-------------"+ error+"==========================");
                    }
                });
                //将Request对象添加到RequestQueue里面。
                requestQueue.add(request);

(3)Post请求的方式:

通过指定请求方法为Request.Method.POST使其成为post请求,然后重新getParams方法设置请求参数。当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数
//创建RequestQueue对象

    RequestQueue requestQueue = Volley.newRequestQueue(this);
                String url="http://api.m.panda.tv/ajax_get_all_subcate";
                StringRequest request=new StringRequest(Request.Method.POST, url, new           Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        Log.e("tag", "请求成功============"+response);
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("tag", "请求成功============"+error);
                    }
                }){

                    /**
                     * 重写getParams方法设置参数,post添加参数的方法
                     */
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        HashMap<String, String> params = new HashMap<String,String>();
                        params.put("__version", "1.0.1.1300");
                        params.put("__plat", "android");
                        return params;
                    }

                };
                requestQueue.add(request);

(3)加载图片的方式:

第一种加载图片的方法

    RequestQueue requestQueue = Volley.newRequestQueue(context);
            String img = datas.getImg();
            //第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。
              //第五个参数用于指定图片的颜色属性
            ImageRequest request=new ImageRequest(img, new Response.Listener<Bitmap>() {

                @Override
                public void onResponse(Bitmap response) {
                    holder.iv.setImageBitmap(response);
                }
            }, 0, 0,Bitmap.Config.ARGB_8888, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    // TODO Auto-generated method stub

                }
            });
            requestQueue.add(request);

第二种加载图片的方法

其实加载图片的功能还远远不止这些,使用ImageLoader可以实现对图片的缓存,还可以过滤重复链接,避免发送重复的请求
ImageLoader的使用方法概括为以下几步
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。

    //继承ImageCache,使用LruCache实现缓存
        public class BitmapCache implements ImageLoader.ImageCache {
          private LruCache<String, Bitmap> mCache;
          public BitmapCache() {
            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);
          }
        }
        private void getImageByImageLoader() {
          ImageView iv= (ImageView) findViewById(R.id.iv);
          RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
          String url = "https://www.baidu.com/img/bdlogo.png";
          ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
          // 第一个参数指定用于显示图片的ImageView控件
          // 第二个参数指定加载图片的过程中显示的图片
          // 第三个参数指定加载图片失败的情况下显示的图片
          ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
          // 调用ImageLoader的get()方法来加载图片
          // 第一个参数就是图片的URL地址
          // 第二个参数则是刚刚获取到的ImageListener对象
          // 如果想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度,即通过第三第四个参数指定
          loader.get(url,listener);
        }
    第三种加载图片的方法
    最后,Volley提供了一种自定义ImageView来加载图片,其使用方法可概括为
    1. 创建一个RequestQueue对象。
    2. 创建一个ImageLoader对象。
    3. 在布局文件中添加一个NetworkImageView控件。
    4. 在代码中获取该控件的实例。
    5. 设置要加载的图片地址。

    步骤一:我们在布局中申明该控件
    <com.android.volley.toolbox.NetworkImageView
                android:id="@+id/network_image_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                />
    步骤二:在程序中实现加载
    public void networkImageView(){
      RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
      ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
      NetworkImageView niv= (NetworkImageView) findViewById(R.id.network_image_view);
      niv.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载中显示的图片
      niv.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败时显示的图片
      niv.setImageUrl("https://www.baidu.com/img/bdlogo.png",  loader);//设置目标图片的URL地址
    }

4、自定义Request

在实际应用中,往往需要将http请求与json进行集成,而Volley正恰恰支持这样的方式,不过需要我们自己自定义Request,这里我们使用google的Gson库进行集成。
1. 继承Request类
2. 重写parseNetworkResponse,实现json与实体类转换,由于实体类未定,所以采用泛型
下文用到的json字符串如下
{“name”:”lizhangqu”,”age”:16}

步骤一:

package cn.edu.zafu.http;
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.toolbox.HttpHeaderParser;
    import com.google.gson.Gson;
    import java.io.UnsupportedEncodingException;
    /**
     * Created by lizhangqu on 2015/5/7.
     */
    public class GsonRequest<T> extends Request<T> {
      private final Response.Listener<T> mListener;
      private Gson mGson;
      private Class<T> mClass;
      public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener,
                 Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mGson = new Gson();
        mClass = clazz;
        mListener = listener;
      }
      public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
                 Response.ErrorListener errorListener) {
        this(Method.GET, url, clazz, listener, errorListener);
      }
      @Override
      protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
          String jsonString = new String(response.data,
              HttpHeaderParser.parseCharset(response.headers));
          return Response.success(mGson.fromJson(jsonString, mClass),
              HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
          return Response.error(new ParseError(e));
        }
      }
      @Override
      protected void deliverResponse(T response) {
        mListener.onResponse(response);
      }
    }

步骤二:编写测试实体类,两个字段一个name一个age

    package cn.edu.zafu.http;
    /**
     * Created by lizhangqu on 2015/5/7.
     */
    public class Person {
      private String name;
      private int age;
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public int getAge() {
        return age;
      }
      public void setAge(int age) {
        this.age = age;
      }
      @Override
      public String toString() {
        return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
      }
    }

步骤三:调用方法和StringRequest是一样的。如下所示

private void json(){
      RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
      String url = "http://121.41.119.107/test/index.php";
      GsonRequest<Person> request=new GsonRequest<Person>(url, Person.class, new Response.Listener<Person>() {
        @Override
        public void onResponse(Person response) {
          Log.d("TAG",response.toString());
        }
      }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
      });
      queue.add(request);
    }

请点击可以下载volley请求的源代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值