android Volley网络请求框架使用

2017-05-31  本文已影响0人  WeiAai

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

get请求

private voidget(){

RequestQueue rq= Volley.newRequestQueue(getApplicationContext());

StringRequest有三个参数  一个是请求地址  一个是强求成功调用的方法,一个是请求失败调用的方法

StringRequest sr=new StringRequest(url, newResponse.Listener() {

@Override

public voidonResponse(String s) {    textView.setText(s.toString());   }

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {}

});

rq.add(sr);

}


POST方法

RequestQueue rq= Volley.newRequestQueue(getApplicationContext());

StringRequest stringRequest =newStringRequest(Request.Method.POST,url, newResponse.Listener() {

@Override

public voidonResponse(String s) {

}

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {

}

}) {

@Override

protectedMapgetParams()throwsAuthFailureError {

Map map =newHashMap();

map.put("参数1","value1");

map.put("参数2","value2");

returnmap;

}

};

rq.add(stringRequest);

}

用Volley加载图片,使用这么一个方法

private voidimage(){

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());

ImageRequest imageRequest =newImageRequest(

"http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",

newResponse.Listener() {

@Override

public voidonResponse(Bitmap response) {

imageView.setImageBitmap(response);

}

},0,0,Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError error) {

imageView.setImageResource(R.mipmap.ic_launcher);

}

});

mQueue.add(imageRequest);

}

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

加载网络图片并缓存

写一个ImageCache起到图片缓存的作用

public classBitmapCacheimplementsImageLoader.ImageCache {

privateLruCachemCache;

publicBitmapCache() {

intmaxSize =10*1024*1024;  //这个是缓存大小    10M

mCache=newLruCache(maxSize) {

@Override

protected intsizeOf(String key,Bitmap bitmap) {

returnbitmap.getRowBytes() * bitmap.getHeight();

}

};

}

@Override

publicBitmapgetBitmap(String url) {

returnmCache.get(url);

}

@Override

public voidputBitmap(String url,Bitmap bitmap) {

mCache.put(url,bitmap);

}

}

这样我们就可以用这个类进行缓存图片  接下来进行缓存

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());

ImageLoader imageLoader =newImageLoader(mQueue, newBitmapCache());

ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,

R.mipmap.ic_launcher,R.mipmap.ic_launcher_round);

imageLoader.get("http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",listener);

//imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener, 200, 200);

加载图片参考

网络请求加载参考

上一篇下一篇

猜你喜欢

热点阅读