理解Volley专题<一>

理解Volley专题<一>

第一次写博客,心情有点小激动啊 !由于最近项目遇到了Volley这个东东,之前木咋使用过,为了详细的了解Volley我就一边学习一边和大家共同研究。

Volley的基本用法在里就不再介绍了,我们就直接上他的源码来看看。我觉得学习不应该只学会基本的用法,要深入得了解,学习他人优秀的编码习惯,和编码思想是很重要的。思想是灵魂,尤其重要。

先看看Volley的整体框架:

两个包:

                                                                                                          


我们在代码中一般是这样使用的

RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);

所以先来看看Volley.class


就是两个静态获取RequestQueue对象的方法,和一个字符串。

先看第一个方法,打开后是这样的:

  1. public static RequestQueue newRequestQueue(Context context, HttpStack stack) {  
  2.     File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);//缓存文件  
  3.   
  4.     String userAgent = "volley/0";//UserAgent用来封装应用的包名跟版本号,提供给服务器,就跟浏览器信息一样  
  5.     try {  
  6.         String packageName = context.getPackageName();  
  7.         PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);  
  8.         userAgent = packageName + "/" + info.versionCode;  
  9.     } catch (NameNotFoundException e) {  
  10.     }  
  11.   
  12.     if (stack == null) {//一般我们都不需要传这个参数进来,而volley则在这里会根据SDK的版本号来判断   
  13.         if (Build.VERSION.SDK_INT >= 9) {  
  14.             stack = new HurlStack();//SDK如果大于等于9,也就是Android 2.3以后,因为引进了HttpUrlConnection,所以会用一个HurlStack  
  15.         } else {//如果小于9,则是用HttpClient来实现  
  16.             // Prior to Gingerbread, HttpUrlConnection was unreliable.  
  17.             // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html  
  18.             stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));  
  19.         }  
  20.     }  
  21.   
  22.     Network network = new BasicNetwork(stack);//创建一个Network,构造函数需要一个stack参数,Network里面会调用stack去跟网络通信  
  23. n style="white-space:pre">  </span>//创建RequestQueue,并将缓存实现DiskBasedCache和网络实现BasicNetwork传进去,然后调用start方法  
  24.     RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);  
  25.     queue.start();  
  26.      
  27.     return queue;  
  28. }

大家可以看代码中的注释,这里简要说明一下步骤:

1)创建缓存文件和UserAgenp字符串

2)根据SDK版本来创建HttpStack的实现,如果是2.3以上的,则使用基于HttpUrlConnection实现的HurlStack,反之,则利用HttpClient实现的Htt pClientStack。

3)创建一个BasicNetwork对象,并将HttpStack封装在Network中

4)创建一个DiskBasedCache对象,和Network一起,传给RequestQueue作为参数,创建RequestQueue对象。

5)调用 RequestQueue的 start 方法,然后返回创建的queue对象。


刚才看了第一个方法,现在看看第二个:


   public static RequestQueue newRequestQueue(Context context) {
        return newRequestQueue(context, null);
    }

很简单,比第一个少了一个参数。

这个是我用的这位大神的: http://blog.youkuaiyun.com/sun1021976312/article/details/38128791 它在这一块写的比较详细了我就不多说了,大家可以进去看看这位大神的这块。

我们从第22行代码来看, Network network = new BasicNetwork(stack);

传递的参数是HttpStack stack类型的,这个没见过,咋跟进去看看,这老外的葫芦买的啥药!

public interface HttpStack {
    
    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
        throws IOException, AuthFailureError;


}
原来是一个接 啊 !还有一个返回类型是HttpResponse的performRequest这个方法,

Request<?> request, 

Map<String, String> additionalHeaders

这两参数。

再看看BasicNetwork这个个类是干嘛的!

<span style="font-size: 18px; white-space: pre;">	</span><span style="font-size:18px;">public class BasicNetwork implements Network {</span>

原来这家伙实现Network这个接口,看看这接口里面是啥东西。

<span style="white-space:pre">	</span>public interface Network {
    <span style="white-space:pre">		</span>public NetworkResponse performRequest(Request<?> request) throws VolleyError;
<span style="white-space:pre">	</span>}

定义了一个返回类型是NetworkResponse的preformRequest的方法,参数是一个Resquest。

BasicNetwork实现了它,必然在里面重写了,看看BasicNetwork里面的代码:

  <span style="font-size:18px;">/**
     * @param httpStack HTTP stack to be used
     */
    public BasicNetwork(HttpStack httpStack) {
        // If a pool isn't passed in, then build a small default pool that will give us a lot of
        // benefit and not use too much memory.
        this(httpStack, new ByteArrayPool(DEFAULT_POOL_SIZE));
    }

    /**
     * @param httpStack HTTP stack to be used
     * @param pool a buffer pool that improves GC performance in copy operations
     */
    public BasicNetwork(HttpStack httpStack, ByteArrayPool pool) {
        mHttpStack = httpStack;
        mPool = pool;
    }
</span>
他的两个构造方法,第一个调用了第二构造方法。

今天先到这儿,明晚相约源码。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值