Volley学习记录(一)

Volley

Volley是google出的,google 在2013 i/o大会上提出来的.

google公司为什么会去搞一个volley框架?

* 1. 用户开启一个activity,然后加载网络,这个时候.如果用户点击了finish按钮.activity被销毁了-->网络请求和activity的生命周期是应该联动起来的.
* 2. listview加载图片的情况比较多.如果用户快速的去滑动listview-->getView->快速的加载图片,用户停止操作的时候.其实真正现实的图片最多就几张--->图片应该缓存起来(内存 +本地 )
* 3. 如果用户打开了一个activity,用户旋转了一下屏幕.activity会旋转-->生命周期重走了-->网络请求缓存
* 4. 之前我们的网络请求,httpurlconnection,httpclient,asynctask(api)-->android sdk-->封装性不够好.1000个开发者就有1000种使用方式-->不够统一
* 5. 理念很容易理解,是开源的.

volley是啥?

* 是一种`通信框架`,和xutils中的HttpUtils,BitmapUtils类似

Volley两个核心类

  • Request:一个请求
    • StringRequest:请求的时候直接回来一个String
    • JsonObjectRequest:请求的时候直接回来一个JsonObject
    • JsonArrayRequest:请求的时候直接回来一个JsonArray
    • ImageRequest:请求的时候直接回来一个Bitmap
    • 自定义请求:一会我们会结合gson
  • ImageLoader:图片的加载器
  • NetWorkImageView:继承了imageView,对ImageView进行了拓展
  • RequestQueue:请求队列.

StringRequest

 // 1. 创建StringRequest对象
String url = "http://www.baidu.com";
StringRequest stringRequest = new StringRequest(url, new Listener<String>() {
    @Override
    public void onResponse(String response) {
             System.out.println("success: " + response);
}
}, new Response.ErrorListener() {
    @Override
public void onErrorResponse(VolleyError error) {
System.out.println("error:" + error.getMessage());
    }
});
// 2.创建requestQueue
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);

// 3.发起网络请求-->把request放到requestqueue中
            requestQueue.add(stringRequest);

JsonObjectRequest

// 1.创建jsonObjectRequest对象
String url = "http://192.168.1.100:8080/json/ip.json";
JSONObject jsonRequest = null;// 请求参数可以用jsonObject的方式发送

// jsonString-->JSONObject
// JSONObject jsonObject = new JSONObject(jsonString);

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, jsonRequest,
 new Listener<JSONObject>() {
    @Override
public void onResponse(JSONObject response) {
    //解析jsonObject里的内容
  String ip = response.optString("origin");
  System.out.println("success" + ip);
    }
}, new Response.ErrorListener() {
    @Override
public void onErrorResponse(VolleyError error) {
System.out.println("error:" + error.getMessage());
    }
});
// 2.创建请求队列
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
// 3.发起请求
queue.add(jsonObjectRequest);

tip:JsonObject取值
* String origin = response.getString(“origin”);// 方式一
* 这个如果没有对应的key会抛异常.需要异常处理
* String origin = response.optString(“origin”);// 方式二
* 这个如果没有对应的key不会抛异常.会返回一个默认值
* optString:默认值””
* optInt:默认值 0
* 比如有的实体bean属性很多.我们不喜欢去建议对应的XXX.class的时候.可以使用JsonObject里面的这个方法;

JsonArrayRequest

// 1.创建请求对象
String url = "http://192.168.1.100:8080/json/jsonArray.json";
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Listener<JSONArray>() {
    @Override
public void onResponse(JSONArray response) {
    System.out.println("success: " + response.length());
}
    }, new Response.ErrorListener() {
        @Override
    public void onErrorResponse(VolleyError error) {
        System.out.println("error:" + error.getMessage());
    }
});
// 2.创建队列
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
// 3.发起请求
queue.add(jsonArrayRequest);

ImageRequest

String url = "http://192.168.1.100:8080/img/xxx.jpg";   
ImageRequest imageRequest = new ImageRequest(url, new Listener<Bitmap>() {
    @Override
public void onResponse(Bitmap bitmap) {
    mIv.setImageBitmap(bitmap);

System.out.println("图片大小:" + bitmap.getByteCount());
    }
}, 100, 50, Bitmap.Config.ARGB_4444, new Response.ErrorListener() {
        @Override
    public void onErrorResponse(VolleyError error) {
        System.out.println("error:" + error.getMessage());
        }
});

RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
queue.add(imageRequest);

tip:大图片的处理:
* 大图片处理的核心
* 核心类:BitmapFactory.Options
* 核心方法:
* decodeOptions.inJustDecodeBounds = true;–>得到图片的宽度以及高度,不需要把图片加载到内存 10M
* decodeOptions.inJustDecodeBounds = false;–>真正去加载图片
* decodeOptions.inSampleSize–>采样率–>不同的框架有不同的核心算法
* 特点:2 4 8 –>取值最好使用2的指数

你可能感兴趣的:(android,Volley)