开发app中,使用的网络框架多种多样,其中包括:
1、HttpClient(听说过,没用到过),HttpURLConnection
2、AsyncTask
3、OkHttp
4、Retrofit
5、Volley
以上等等框架,今天就介绍Volley框架的原理与好处。。。(请准备好瓜子)
Volle于2013年Google I/O大会上推出的一个新的网络通信框架,在性能方面进行了大幅度的调整。
(1)、下载Volley框架,在项目中添加依赖,github地址:https://github.com/mcxiaoke/android-volley
compile 'com.mcxiaoke.volley:library:1.0.19'
(2)、在项目中使用Volley
RequestQueue mQueue = Volley.newRequestQueue(context);//创建请求队列
StringRequest返回的数据是String类型的,其源码如下:
public class StringRequest extends Request {
private Listener mListener;
/**
* @param method 请求的方式post/get
* @param url 请求的url地址
* @param listener 请求成功的监听器
* @param errorListener 请求失败或错误的监听器
*/
public StringRequest(int method, String url, Listener listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public StringRequest(String url, Listener listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
...省略
}
其中最重要的是这两个构造方法,第一个比第二个多了一个请求方法参数,如果使用第二个默认使用GET请求。了解了,那么就来试试如何创建:
StringRequest mStringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
//response是请求成功后返回的参数,这时就可以做想做的事了
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//请求出错后返回的参数,可从error.getMessage()中获取错误信息
}
});
//将请求添加到请求队列中
mQueue.add(mStringRequest);
注意:请求网络时别忘了添加网络访问权限
除了StringRequest外,Volley还提供了其他数据加载的模式
与StringRequest加载方式类似,直接上代码:
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url,
new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
mQueue.add(mJsonObjectRequest);
ImageRequest已经是过时的方法了,类似于前面两种,不同的是它可以设置你想要的图片的最大宽度和高度,在加载图片时如果图片超过期望的最大宽度和高度则会进行压缩,源码如下:
public class ImageRequest extends Request {
...省略
/**
* @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
*/
public ImageRequest(String url, Response.Listener listener, int maxWidth, int maxHeight,
ScaleType scaleType, Config decodeConfig, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
setRetryPolicy(
new DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT));
mListener = listener;
mDecodeConfig = decodeConfig;
mMaxWidth = maxWidth;
mMaxHeight = maxHeight;
mScaleType = scaleType;
}
@Deprecated
public ImageRequest(String url, Response.Listener listener, int maxWidth, int maxHeight,
Config decodeConfig, Response.ErrorListener errorListener) {
this(url, listener, maxWidth, maxHeight,
ScaleType.CENTER_INSIDE, decodeConfig, errorListener);
}
...省略
}
用法如下:
ImageRequest imageRequest = new ImageRequest(url,
new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mQueue.add(imageRequest);
ImageLoader是目前三大图片加载框架之一,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能。
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
// 第一个参数是图片组件;第二个参数是默认图片;第三个参数是加载错误时显示的图片。
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.ico_default, R.drawable.ico_default);
imageLoader.get(url, listener);
// 用于缓存图片的ImageCache的实现类
class BitmapCache implements ImageLoader.ImageCache{
public Bitmap getBitmap(String url){
// 获取缓存过的图片
return null;
}
public void putBitmap(String url, Bitmap bitmap){
// 在这里处理图片缓存
}
}
你会发现,在创建ImageLoader对象时需要传递一个消息队列,为什么呢?原理是一样的,不同的是ImageLoader自己在内部实现队列的加载,代码如下(只拿取部分代码):
...省略
public ImageContainer get(String requestUrl, ImageListener imageListener,
int maxWidth, int maxHeight, ScaleType scaleType) {
...省略
Request newRequest = makeImageRequest(requestUrl, maxWidth, maxHeight, scaleType,
cacheKey);
// 在这里添加进队列
mRequestQueue.add(newRequest);
mInFlightRequests.put(cacheKey,
new BatchedImageRequest(newRequest, imageContainer));
return imageContainer;
}
protected Request makeImageRequest(String requestUrl, int maxWidth, int maxHeight,
ScaleType scaleType, final String cacheKey) {
return new ImageRequest(requestUrl, new Listener() {
@Override
public void onResponse(Bitmap response) {
onGetImageSuccess(cacheKey, response);
}
}, maxWidth, maxHeight, scaleType, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onGetImageError(cacheKey, error);
}
});
}
...省略
同时会发现,ImageLoader内部使用ImageRequest来实现图片的加载,但与ImageRequest不同的是,ImageLoader加载图片会先显示默认的图片,等待图片加载完成才会显示在ImageView上。
当然ImageLoader也提供了设置最大宽度和高度的方法:
public ImageLoader.ImageContainer get(String requestUrl, ImageLoader.ImageListener imageListener, int maxWidth, int maxHeight) {
return this.get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
}
至此,Volley就先介绍到这了,还有很多没用到过的东西,也有很多介绍的不够详细的地方,请多多包涵,之后会一一补上,谢谢!