1.Volley是什么?
2.Volley有什么用?(使用场景)
3.Volley的使用步骤
4.Volley的底层源码(工作原理)
1.Volley是什么?
Volley是谷歌2013年IO大会上推出的异步网络框架。Volley,支持请求String\JsonObject
\JsonArray\Image;分别对应与+Request。如:StringRequest\JsonObjectRequest\JsonArrayRequest\ImageRequest;
2.Volley的特点:
非常适用于请求数据量小但是请求频繁,即高并发的情况。
3.使用步骤:
1.创建请求
JsonObjectRequest request = new JsonObjectRequest();
2.获取请求队列(源码分析的入口)
RequestQueue queue = Volley.newRequestQueue(this);
3.将请求添加到请求队列
queue.add(quest);
4.Volley的底层源码(工作原理):其中核心类VCRHN:9个:
Volley
Cache CacheDispatcher
Request RequestQueue RequestDelivery
HttpStack
Network NetworkDispatcher
Volley默认发送的是Get请求。是因为:即默认创建请求对象时要传入3个参数,第一个url,第二个成功的回调,第三个失败的回调。如果想发送Post请求,可在创建请求时选择传入4个参数的,此时第一参数,即是设置请求方式,传入Method.Post即可。后面三个参数与默认时含义一样。
注意:当请求解析JsonArrayQuest时,需要一个传入Type类型的参数type,写法有些麻烦,但绝对是一个加分项:Type type = new TypeToke>(){ }.getType;
5.通过源码分析其原理:
RequestQueue queue = Volley.newRequestQueue(this);【入口】
在创建请求队列对象时,这是主入口。这个方法有不同数量的参数的,最终获取缓
存路径,创建缓存文件,且获取包名+版本号;同时,根据stack ==
null 这个条件判断,进行版本适配。如果版本>9,即2.3,
要进行版本适配的原因:HttpClient android 5.0 开始过时;因为Apache公司不再维护了。Http android6.0,彻底废弃;
在该构造方法内,创建了queue,同时调用queue.start();启动队列。
queue.start();进入到start()方法内部,不管三七21,创建了CacheDispatcher(Thread的子类)对象,说白了就是创建了一个线程并开启。同时又创建了线程池里的默认的4条NetworkDispatcher对象(说白了也是子线程),并开启。
即:在添加请求到请求队列前,Volley就已在创建请求队列时,就创建完成并开启了5个子线程,一个缓存的CacheDispatcher,4个用于发送网络请求的NetworkDispatcher,等待请求到来。一旦有请求了,负责网络请求的子线程NetworkDispatcher对象,就拿着请求去请求数据了。这里创建多条子线程,也就体现了Volley适用于请求数据量小但是请求频繁的情景。
看完源码后的优化:
优化1.创建Volley单粒,避免每创建一个请求队列就同时内部自动创建5条子线程的内存损耗行为,所以把请求队列设置为单粒的。
优化2.如果打开了一个页面,假如是AActivity,自动去请求,假设有10个请求,在数据没有返回前,我返回了,即退出该页面。此时,部分请求在请求队列中排队,则此时最好的做法是取消剩余没有发送的请求,也叫Activity(或Fragment)与Volley的联动取消。
onDestroy(){
requestQueue.cancelAll();
}
具体做法:1.可以整体取消 requestQueue.cancelAll();
2.也可以针对性的取消:但先对请求对象设置一个标记Tag;request.setTag(xxxTag);然后就可以根据该标记有针对性的取消请求了。 requestQueue.cancelAll(xxxTag);