关于对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