volley源码解析

         Volley源码解析,其实很多人都讲解过了,其中这位作者在这篇文章中做了很详细深入的讲解http://codekk.com/open-source-project-analysis/detail/Android/grumoon/Volley%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90;下面我将自己查看volley源码的经验和见解也和大家分享一下。

         volley源码中进行数据请求的时候主要涉及到了一下几个类(其中有些解释的不够全面,以后慢慢更新吧):     

       Volley类:

  • File cacheDir创建缓存文件目录下的文件
  • 根据Build.VERSION.SDK_INT版本来确定使用HttlUrlConnection还是HttpClient进行网络请求

         将这两个作为参数传递给RequestQueue:RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);


       RequestQueue类:

       构造函数确定了Cache,Network,NetworkDispatcher和ResponseDelivery,其中ResponseDelivery构造函数传入了Hander,此Hander跟主线程的looper相关联,将分发线程里面的结果通过hander.post发送到主线程mDelivery=new ExecutorDelivery(new Handler(Looper.getMainLooper()))。


         add(Request request)方法:首先mCurrentRequests.add(request);如果request不缓存,直接加入到mNetworkQueue,否则根据request.getCacheKey()获得cacheKey(源码中cacheKey为request的url),如果mWaitingRequests中包含cacheKey,移除mWaitingRequests里面的request。


       CacheDispatcher类

       成员变量:mCache,mCacheQueue ,mNetworkQueue,ResponseDelivery。

         run()方法:1.mCache.initialize()将缓存文件中的信息读取到内存中;2.从缓存队列mCacheQueue中取出一个Request,Request取消进行下一步操作,request不在缓存中或者失效过期,加入到mNetworkQueue,否则从缓存中取出数据,Response<?> response = request.parseNetworkResponse(

                        new NetworkResponse(entry.data, entry.responseHeaders))转化成需要的response,通过ResponseDelivery分发到主线程中,如果是Soft-expired,则先将结果分发到主线程,同时将request加入到mNetworkQueue。


       NetworkDispatcher类

        成员变量:mCache,mCacheQueue ,mNetworkQueue,ResponseDelivery。

         run()方法:从网络请求队列mNetworkQueue中取出一个Request,如果Request取消进行下一步操作,NetworkResponse networkResponse = mNetwork.performRequest(request)通过网络请求获得networkResponse,Response<?> response = request.parseNetworkResponse(

                        new NetworkResponse(entry.data, entry.responseHeaders))转化成需要的response,根据request和response信息看看是否需要加入到缓存中,然后通过ResponseDelivery分发到主线程中


      ResponseDelivery类


      NetworkImageView类

         成员变量:mUrl,mImageLoader,mImageContainer 

         loadImageIfNecessary(final boolean isInLayoutPass)方法:mUrl为空,setImageBitmap(null);第一次mImageContainer为null,调用mImageLoader .get(String requestUrl, final ImageListener listener)方法。


      ImageLoader类

        主要成员变量:mRequestQueuemCache 

         静态的getImageListener(final ImageView view, final int defaultImageResId, final int errorImageResId)方法:可以给ImageView赋图片; 

         接口ImageCache,实现其getBitmap和putBitmap方法来实现图片的L1缓存;

         get(String requestUrl, ImageListener imageListener,int maxWidth, int maxHeight)方法:首先根据cacheKey和ImageCahe.getBitmap(cacheKey)(这个需要自己外部实现图片的L1缓存,存入内存当中)判断内存缓存中是否存在Bitmap信息;如果存在new一个ImageContainer对象(此对象含有不为null的bitmap对象),并通过imageListener.onResponse(container, true)将结果setImageBitmap(container.getBitmap());如果不存在,new一个ImageContainer对象(此对象的bitmap对象为null),然后通过ImageRequest从获取图片信息(通过ImageRequest的本地缓存分发线程和网络分发线程获取图片),获取之后将其加载到mcache内存缓存中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值