网络加载框架:Volley

前言

开发app中,使用的网络框架多种多样,其中包括:

1、HttpClient(听说过,没用到过),HttpURLConnection

2、AsyncTask

3、OkHttp

4、Retrofit

5、Volley

以上等等框架,今天就介绍Volley框架的原理与好处。。。(请准备好瓜子)

1、简介

Volle于2013年Google I/O大会上推出的一个新的网络通信框架,在性能方面进行了大幅度的调整。

2、如何使用Volley

(1)、下载Volley框架,在项目中添加依赖,github地址:https://github.com/mcxiaoke/android-volley

compile 'com.mcxiaoke.volley:library:1.0.19'

(2)、在项目中使用Volley

1、创建请求队列
RequestQueue mQueue = Volley.newRequestQueue(context);//创建请求队列
2、创建StringRequest请求参数

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还提供了其他数据加载的模式

3、JsonRequest用法

与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);
4、ImageRequest用法

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);
5、ImageLoader用法

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就先介绍到这了,还有很多没用到过的东西,也有很多介绍的不够详细的地方,请多多包涵,之后会一一补上,谢谢!

你可能感兴趣的:(网络加载框架:Volley)