Volley学习(Volly分析)
记录下学习心得:
Volley是android平台上的网络通讯库,能使网络通信更快,更简单,更便捷。Volly适合数据量不大但是通信频繁的场景。
先贴下Volley的架构图:
Volley框架设计的主要几个类是Request(以及Volley提供的子类ImageRequest,StringRequest,JsonReques等),Volly,RequestQueue,CacheDispatcher,DiskBasedCache,NetworkDispatcher,BasicNetWork,HurlStack(HttpClientStack),ByteArrayPool,NetworkResponse,ExcutorDeliery(按照从新建一个Request请求到请求得到处理的顺序写的)。
下面的分析也是按照请求从创建到得到处理的顺序来完成的。
在Volley框架中,Request的管理是由RequestQueue来控制的。当我创建一个新的Request请求时,先创建一个RequestQueue对象,
RequestQueue= Volley.newRequestQueue(context);
看下newRequestQueue里面做了什么。
public static RequestQueue newRequestQueue(Context context, HttpStack stack) { File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); String userAgent = "volley/0"; try { String packageName = context.getPackageName(); PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); userAgent = packageName + "/" + info.versionCode; } catch (NameNotFoundException e) { } if (stack == null) { if (Build.VERSION.SDK_INT >= 9) { stack = new HurlStack(); } else { // 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); RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); queue.start(); return queue; }
首先在android 默认的缓存文件中创建一个缓存目录,在这里为什么选择系统默认的缓存文件夹,是因为放在系统默认的文件夹下,当apk删除时,文件夹下的缓存也相应被删除。
设置userAgent后,开始创建HttpStack,Volley根据系统版本来创建不同Stack,如果SDk的版本小于9的话,选择HtpClientSack,否则选择HurlStack,Volley这样做的原因是
在 Froyo(2.2) 之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效,所以在 Froyo 之前使用 HttpURLConnection 需要关闭 keepAlive。
另外在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提高了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了请求结果缓存。
再加上 HttpURLConnection 本身 API 相对简单,所以对 Android 来说,在 2.3 之后建议使用 HttpURLConnection,之前建议使用 AndroidHttpClient。
创建玩HttpStack后,开始创建请求队列,RequestQueue里的参数有两个,一个是缓存处理类(DiskBasedCache),一个是网络请求处理类(BasicNetwork),初始化完毕后,调用queue.start()方法,启动线 程(这部分在RequestQueue中再分析)等待Request的到来。