理解Volley专题<一>
第一次写博客,心情有点小激动啊 !由于最近项目遇到了Volley这个东东,之前木咋使用过,为了详细的了解Volley我就一边学习一边和大家共同研究。
Volley的基本用法在里就不再介绍了,我们就直接上他的源码来看看。我觉得学习不应该只学会基本的用法,要深入得了解,学习他人优秀的编码习惯,和编码思想是很重要的。思想是灵魂,尤其重要。
先看看Volley的整体框架:
两个包:
我们在代码中一般是这样使用的
RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
所以先来看看Volley.class
就是两个静态获取RequestQueue对象的方法,和一个字符串。
先看第一个方法,打开后是这样的:
- public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
- File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);//缓存文件
- String userAgent = "volley/0";//UserAgent用来封装应用的包名跟版本号,提供给服务器,就跟浏览器信息一样
- try {
- String packageName = context.getPackageName();
- PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
- userAgent = packageName + "/" + info.versionCode;
- } catch (NameNotFoundException e) {
- }
- if (stack == null) {//一般我们都不需要传这个参数进来,而volley则在这里会根据SDK的版本号来判断
- if (Build.VERSION.SDK_INT >= 9) {
- stack = new HurlStack();//SDK如果大于等于9,也就是Android 2.3以后,因为引进了HttpUrlConnection,所以会用一个HurlStack
- } else {//如果小于9,则是用HttpClient来实现
- // Prior to Gingerbread, HttpUrlConnection was unreliable.
- // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
- stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
- }
- }
- Network network = new BasicNetwork(stack);//创建一个Network,构造函数需要一个stack参数,Network里面会调用stack去跟网络通信
- n style="white-space:pre"> </span>//创建RequestQueue,并将缓存实现DiskBasedCache和网络实现BasicNetwork传进去,然后调用start方法
- RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
- queue.start();
- return queue;
- }
大家可以看代码中的注释,这里简要说明一下步骤:
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>
他的两个构造方法,第一个调用了第二构造方法。
今天先到这儿,明晚相约源码。