Volley使用详解

volley框架:
1、参考了已有框架的优点
2、开源

特点:
1.自动调度网络请求,并在子线程中执行
2.多个并发的网络连接
3.通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
4.支持请求优先级
5.支持取消请求的强大API,可以取消单个请求或多个

核心对象:
RequestQueue 用来执行请求的请求队列
Request 用来构造一个请求对象
Request对象主要有以下几种类型:

StringRequest 响应的主体为字符串
JsonArrayRequest 发送和接收JSON数组
JsonObjectRequest 发送和接收JSON对象
ImageRequest 发送和接收Image

RequestQueue mQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest("http://route.showapi.com/6-1?showapi_appid=19987&showapi_sign=b9054b15df244f6a88588f33cd4372ea&num=15093238875\n",
                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);
            }
        });
        mQueue.add(stringRequest);

Volley的基本使用
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。

//开发流程
RequestQueue mQueue = Volley.newRequestQueue(context); 

//是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回
调。
StringRequest stringRequest = new StringRequest(url,Listener,ErrorListener);
mQueue.add(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);  
                                }  
                            });  
  ```

JsonObjectRequest、JsonArrayRequest、StringRequest的用法

//null:参数json格式
JsonObjectRequest stringRequest = new JsonObjectRequest(url,null,Listener,ErrorListener);

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

//长按事件
**.setOnLongClickListener(new View.OnLongClickLinstener(){
 public booblen onLongClick(View v){
        return flase;//flase表示不再向下传递,true表示从父标记向下传递此状态,子标记共享此事件
        }
}

Post传参:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener); 
//POST是常量,此处的Method.POST表示用POST的方法传参
重写StringRequest类的getParams()方法。
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,get

get:效率高,2k,
post:可以提交大数据量,传递非英文字符,

图片加载

使用ImageRequest下载图片
ImageRequest imageRequest = new ImageRequest(url,Listener,0,0,Config.RGB_565,ErrorListener);


    ImageRequest imageRequest = new ImageRequest(  
            "http://developer.android.com/images/home/aw_dac.png",  
            new Response.Listener<Bitmap>() {  
                @Override  
                public void onResponse(Bitmap response) {  
                    imageView.setImageBitmap(response);  
                }  
            }, 0, 0, Config.RGB_565, new Response.ErrorListener() {  
                @Override  
                public void onErrorResponse(VolleyError error) {  
                    imageView.setImageResource(R.drawable.default_image);  
                }  
            }); 

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

使用ImageLoader

  1. 创建一个RequestQueue对象。
  2. 创建一个ImageLoader对象。
  3. 获取一个ImageListener对象。
  4. 调用ImageLoader的get()方法加载网络上的图片。
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {  
        @Override  
        public void putBitmap(String url, Bitmap bitmap) {  
        }  

        @Override  
        public Bitmap getBitmap(String url) {  
            return null;  
        }  
    });  
//一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
    ImageListener listener = ImageLoader.getImageListener(imageView,  
            R.drawable.default_image, R.drawable.failed_image);  
    imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);  
//指定图片允许的最大宽度和高度
    imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  
                    listener, 200, 200); 
//这里我们将缓存图片的大小设置为10M。
    public class BitmapCache implements 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);  
        }  
 } 

使用NetworkImageV

ImageLoader loader=new ImageLoader(RequestQueue, ImageCache)

networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);  

    networkImageView.setDefaultImageResId(R.drawable.default_image);  
    networkImageView.setErrorImageResId(R.drawable.failed_image);  
    networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  
                    imageLoader);  

取消Request

  Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。一般写在Activity的onStop方法中。

1)可以针对某些个request做取消操作:

 @Override
    public void onStop() {
        for (Request <?> req : mRequestQueue) {
            req.getTag().equals()
            req.cancel();
        }
    }

2)取消这个队列里的所有请求:
//可以在Activity中设置一个常量TAG,给每一个request.setTag,取消对应Tag让请求就可以了

 @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        mRequestQueue.cancelAll(this);
    }

//可以通过setTag方法为每一个Request添加tag
req.setTag(“Tag”);
//取消Request
reqQueue.cancelAll(“Tag”);

设置请求优先级

在实际开发中我们常常需要提高一些请求的优先级以便优先执行,可以通过覆写getPrioriity()方法

//优先级有LOW,NORMAL,HIGH,IMMEDIATE
private Priority priority = Priority.HIGH;

StringRequest strReq = new StringRequest(Method.GET,
          Const.URL_STRING_REQ, 
          new Response.Listener<String>() {

     @Override
     public void onResponse(String response) {
             Log.d(TAG, response.toString());
             msgResponse.setText(response.toString());
             hideProgressDialog();
         }
     }, new Response.ErrorListener() {

      @Override
      public void onErrorResponse(VolleyError error) {
              VolleyLog.d(TAG, "Error: " + error.getMessage());
              hideProgressDialog();
      }
  }) {
     @Override
      public Priority getPriority() {
           return priority;
      }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值