android高级控件之Volley

一、Volley简介
  • 直接用HttpURLConnection和HttpClient进行网络请求比较复杂,不进行封装的话,会有很多重复代码
  • 2013年Google I/O大会上推出了一个新的网络通信框架——Volley,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕
二、Volley的使用场景(简单信息的数据加载,图片等)

三、导入Volley(可以直接将volley的源码拷贝到工程的相应的目录下)
四、 使用Volley
  • 三种基本网络请求的实现
     第一步: 新建请求队列:
       RequestQueue mQueue = Volley.newRequestQueue(context);  //一个工程用一个请求队列即可,可以建一个自定义的application,并在清单文件中注册
     第二步:新建request
    第三步:把request加入请求队列
  1. StringRequest        
    Get请求:
  
  
       //应该保证一个运用一个对象,通常我们会将这种需要统一的对象放在自定义的application里面(需要在清单文件中注册,在application标签下的name
        //属性,将我们自定义的application导入),
       //这样就保证了整个项目中的这个对象就是同一个了  
	mRequestQueue = Volley.newRequestQueue(this);

       public void stringGetRequest() {
       //新建一个字符串网络请求
       //第一个参数:url--请求的网址
       //第二个参数:响应监听
       //第三个参数:错误监听
	    StringRequest request = new StringRequest(
	    "https://www.baidu.com/",
             new Response.Listener<String>() {
	     @Override
	      public void onResponse(String response) {
                    Log.d("qfstringRequest",response);
	      }
               },
            new Response.ErrorListener() {
	@Override
	public void onErrorResponse(VolleyError error) {

                }
            });

	//把请求加入队列
	requestQueue.add(request);
	}
post请求:
   
StringRequest postStringRequest = new StringRequest(
	Request.Method.POST,//请求方式
	"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",//请求地址
        new Response.Listener<String>() {//请求成功后返回的结果
	@Override
	public void onResponse(String response) {
                Log.d("VolleyLesson",response);
	}
        },
        new Response.ErrorListener() {//请求失败后返回的错误信息
	@Override
	public void onErrorResponse(VolleyError error) {
                Log.d("VolleyLesson",error.getMessage());
	}
        }
	){
        /**
          *封装请求参数,post请求需要把请求参数另外存储,而get请求只需要拼接到请求地址后面就可以,当然也可以使用封装参数的方法
          *
          */
         @Override
   	 protected Map<String, String> getParams() throws AuthFailureError 	 {
         Map<String,String> mapParam =  new HashMap<String,String>();
         // 设置参数
         // pagesize 每页多少行
         mapParam.put("pagesize", "20");
         // pageindex 页码
         mapParam.put("pageindex", "2");
         return mapParam;
    	}
	};
	mRequestQueue.add(postStringRequest);
	
	取消重复的请求,这样能够防止用户连续点击的时候,只发送一次请求,这样即减轻网络加载的负担,也减少流量的使用
	mRequestQueue.cancelAll("test");
	postStringRequest.setTag("test");


2.JsonRequest
    JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它    
    的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和    JsonArrayRequest
   
        JsonRequest jsonRequest = new JsonObjectRequest	(Request.Method.POST,//请求方式
	"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",//请求的地址
 	new Response.Listener<JSONObject>() {//请求成功的监听
	@Override
	public void onResponse(JSONObject response) {//response就是返回的json数据
                Log.d("volleylesson",response.toString());
	}
        },
        new Response.ErrorListener() {//请求失败的监听
	@Override
	public void onErrorResponse(VolleyError error) {//返回请求失败的错误信息
          
            }
        }
	){
        //封装请求参数
        @Override
	protected Map<String, String> getParams() throws AuthFailureError {
        Map<String,String> mapParam =  new HashMap<String,String>();
	// 设置参数
        // pagesize 每页多少行
	mapParam.put("pagesize", "20");
	// pageindex 页码
	mapParam.put("pageindex", "2");
        return mapParam;
	}
	};
	mRequestQueue.add(jsonRequest);//加入请求队列
3.ImageRequest(图片请求)
        
       public void showImgByImageReq(){
/**
 * Creates a new image request, decoding to a maximum specified width and
 * height. If both width and height are zero, the image will be decoded to
 * its natural size. If one of the two is nonzero, that dimension will be
 * clamped and the other one will be set to preserve the image's aspect
 * ratio. If both width and height are nonzero, the image will be decoded to
 * be fit in the rectangle of dimensions width x height while keeping its
 * aspect ratio.
 *
 * @param url URL of the image
 * @param listener Listener to receive the decoded bitmap
 * @param maxWidth Maximum width to decode this bitmap to, or zero for none
 * @param maxHeight Maximum height to decode this bitmap to, or zero for
 *            none
 * @param scaleType The ImageViews ScaleType used to calculate the needed image size.
 * @param decodeConfig Format to decode the bitmap to
 * @param errorListener Error listener, or null to ignore errors
 */
               ImageRequest imageRequest = new ImageRequest(
		"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",//图片请求地址
            	new Response.Listener<Bitmap>() {//请求成功后的监听
		@Override
		public void onResponse(Bitmap response) {//返回Bitmap类型的图片资源
		ivImageReq.setImageBitmap(response);
		}
            	},
	        500, //设置图片最大的宽度
		500, //设置图片的最大的高度
		ImageView.ScaleType.CENTER,//设置图片的存放的类型,是居中,拉伸,等比例缩放... 
		Bitmap.Config.ARGB_8888,//设置一个像素点占多少个字节,当且8888代表每个像素点有4个字节
            	new Response.ErrorListener() {//请求失败的监听
		@Override
		public void onErrorResponse(VolleyError error) {
                      Log.i("rag"," 错误信息"+error.getMessage());
                }
                });
		mRequestQueue.add(imageRequest);//加入请求队列
	}
4.ImageLoad
    相比ImageRequest,可以设置内存缓存,可以设置加载和失败时默认显示的图片
       /**
         * 查找顺序:先查找内存,再查找本地文件,最后从网络下载
         * 存储顺序:从网络下载->存在内存,同时存放到本地文件
         * 如果没有写到缓存,只存在本地文件
         */
        private void showImgByImageLoad() {
    
        //获取APP能使用的最大内存
        //last recently use:最近最少使用的算法
	int iMaxMem = (int) Runtime.getRuntime().maxMemory();

   	final LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(iMaxMem/8){
	@Override
	protected int sizeOf(String key, Bitmap value) {
	       return value.getByteCount();//返回图片的大小 默认返回1
	}
    	};
        ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
	@Override
	public Bitmap getBitmap(String url) {//从内存中获取照片
	return lruCache.get(url);
	}

	@Override
	public void putBitmap(String url, Bitmap bitmap) {
	lruCache.put(url,bitmap);//将图片写入内存
	}
    	});
    /**@param view The imageView that the listener is associated with.
     * @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
     * @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
     */
	ImageLoader.ImageListener listener = ImageLoader.getImageListener(ivImageReq,
	R.mipmap.ic_launcher,//设置默认图片
	R.mipmap.ic_launcher);
       //自己给imageview控件设置值
         /*ImageLoader.ImageListener listener = new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                iv.setImageBitmap(response.getBitmap());
            }

            @Override
            public void onErrorResponse(VolleyError error) {
                iv.setImageResource(R.mipmap.ic_launcher);
            }
        };*/
	imageLoader.get("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
	listener
            );
	}
5.NetworkImage解决了图片错位的问题,

      private void showNetImg() {

    		ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
		@Override
		public Bitmap getBitmap(String url) {
			return null;//获取内存的资源
		}

		@Override
		public void putBitmap(String url, Bitmap bitmap) {
                        //将加载的图片存储在内存中
       		 }
   		});
		mNetworkImageView.setDefaultImageResId(R.mipmap.ic_launcher);//设置默认图片
		mNetworkImageView.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败后显示的照片
		mNetworkImageView.setImageUrl("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
		imageLoader);
	}








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值