为什么使用Volley框架

关于对Volley的分析,发现一篇深入的好文,所有不再赘述了,直接来这里吧。
https://github.com/android-cn/android-open-project-analysis/tree/master/volley

什么是Volley框架

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。
Volley在Google I/O 2013上发布的使Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。


HttpURLConnection和HttpClient选择

Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

  • Build.VERSION.SDK_INT < 9
    在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。

  • Build.VERSION.SDK_INT >= 9
    而在Android2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。


为什么使用Volley框架?

优点有:

1. 简化了http请求的操作

HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。

2. 异步下载、返回到主线程

在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(aplication Not Response)异常.
安卓不允许在其他线程中对ui进行操作,所以如果发生网络请求后,需要对界面进行刷新,就必须要界面刷新的代码在主线程中执行.
综上所述,可行的方案基本有以下两种().
Thread+handler
AsyncTask

而Volley则完全不用考虑这些问题。

3. JSON,图像等的处理

在http请求之后一般都需要对数据进行预处理,尤其是对图片的预处理,而Volley对这些操作进行了基本的封装。在简单的使用情景下,基本够用了。但是如果需要对其进行一些复杂的操作,就需要增加自己的请求类.

4. 缓存

我们在主线程中调用RequestQueue的add()方法来添加一条网络请求,这条请求会先被加入到缓存队列当中,如果发现可以找到相应的缓存结果就直接读取缓存并解析,然后回调给主线程。如果在缓存中没有找到结果,则将这条请求加入到网络请求队列中,然后处理发送HTTP请求,解析响应结果,写入缓存,并回调主线程。

5. 多级别取消请求和Activity生命周期的联动

某些情况下我们需要取消已经添加到队列的请求,volley对这一操作进行了很好的封装.

比如Activity被终止之后,如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。
使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。

    /**
     * Cancels all requests in this queue with the given tag. Tag must be non-null
     * and equality is by identity.
     */
    public void cancelAll(final Object tag) {
        if (tag == null) {
            throw new IllegalArgumentException("Cannot cancelAll with a null tag");
        }
        cancelAll(new RequestFilter() {
            @Override
            public boolean apply(Request<?> request) {
                return request.getTag() == tag;
            }
        });
    }


    /**
     * Cancels all requests in this queue for which the given filter applies.
     * @param filter The filtering function to use
     */
    public void cancelAll(RequestFilter filter) {
        synchronized (mCurrentRequests) {
            for (Request<?> request : mCurrentRequests) {
                if (filter.apply(request)) {
                    //调用request对象的cancel方法
                    request.cancel();
                }
            }
        }
    }

    /**
     * Mark this request as canceled.  No callback will be delivered.
     */
    public void cancel() {
        //这里并不是取消正在请求的request,而是将请求的cancel标记设置为true.在处理消息时将不会对他进行请求处理
        mCanceled = true;
    }


public class CacheDispatcher extends Thread {  

    ……  

    @Override  
    public void run() {  
        if (DEBUG) VolleyLog.v("start new dispatcher");  
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);  
        // Make a blocking call to initialize the cache.  
        mCache.initialize();  
        while (true) {  
            try {  
                // Get a request from the cache triage queue, blocking until  
                // at least one is available.  
                final Request<?> request = mCacheQueue.take();  
                request.addMarker("cache-queue-take");  
                // If the request has been canceled, don't bother dispatching it.  
                if (request.isCanceled()) {  
                    request.finish("cache-discard-canceled");  
                    continue;  
                }  

6. 网络请求的队列排序(scheduling)

待添加。。

7. 网络请求的优先级处理

待添加。。

8. Volley是谷歌出品,且他是开源的

因为它是谷歌出品,所以它的代码质量有保证。因为他是开源的,所以我们可以进行深入的学习。这个框架的意义更大的在于,我们可以在volley的基础上构建自己的http框架。

Volley的缺点(不能算是缺点,只是需要自己去扩展的)

https://github.com/smanikandan14/Volley-demo
以上为Volley实现的各种demo,包括文件上传,SSL and so on . 可以根据demo自己去扩展httpStack以及Request.

1. 大数据的传输

    Volley设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
    另:为什么会对这样的特性?
    答:因为volley在读取到response的数据,都是放到内存中等待Request的最后转换,so,大文件会缓存到内存中,不建议这么来。

2. Cookie使用

3. 文件上传

4. Post优化

5. Https的支持

参考:
http://blog.csdn.net/guolin_blog/article/details/12452307
http://blog.csdn.net/guolin_blog/article/details/17656437
http://blog.csdn.net/t12x3456/article/details/9221611

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值