Volley框架分析

来源:互联网 发布:slam算法工作原理 编辑:程序博客网 时间:2024/05/17 02:17

喜欢逛github的朋友们就知道现在开源的一些主流的访问网络的框架由xutils, Afinal,Volley等,其他的没具体看过。下面来介绍Volley框架的原理。


1.首先介绍下volley是google官方推出的框架。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。

   优势:适合轻量级数据频繁访问网络的环境。  劣势: 不适合大数据,比如下载文件。(如果数据太大就会出OOM)


2.先来看看怎么使用


mQueue = Volley.newRequestQueue(getApplicationContext());  mQueue.add(new JsonObjectRequest(Method.GET, url, null,              new Listener() {                  @Override                  public void onResponse(JSONObject response) {                      Log.d(TAG, "response : " + response.toString());                  }              }, null));  mQueue.start(); 


</pre><pre class="java" name="code">

3.下面介绍一下运行的过程


可以参照这幅图,大概流程就是Volley先初始化一个请求队列,请求队列start, 开启1个读取缓存的线程CacheDispatcher和4个访问网络的线程NetworkDispatcher,其中访问网络的细节有兴趣的可以研究, 访问成功后将数据封装,然后通过handler回调到request。


 下面继续研究一下细节

①.volley在访问网络的时候在2.3版本之前是通过HttpClient, 2.3版本以后用的是HttpURLConnection。 因为在2.3之前HttpURLConnection极不稳定 ,而2.3以后HttpURLConnection改善了许多,HttpURLConnection的效率较高,所以采用HttpURLConnection。

       

               ②RequestQueue.add(Request)的时候是先将request添加到缓存队列中,在start的方法中开启一个读取缓存数据的线程和4个访问网络的线程, 当读取缓存中不存在   的时候再将request添加到访问网络的队列中。这几个线程中都有死循环,request = mQueue.take(), 阻塞等待。 和系统的handler等待机制差不多。(这里有不理解的地方时为什么不是使用线程池管理, 如果没有网络使用的时候, 5个线程还是会阻塞等待在那里。可能这就是适合频繁访问网络)


              ③.在NetworkDispatcher的run方法中有两个处理数据的方法,mNetwork.performRequest(request)是将网络访问的信息序列化NetworkResponse, request.parseNetworkResponse(networkResponse)是将数据转化为我们想要的数据格式(String,Bitmap等),该方法的具体实现是在不同request中的(JsonObjectRequest),这样就增强了扩展性,降低了耦合度。然后也方便将byte数组缓存到文件中。


           ④.回调,在NetworkDispatcher访问网络和数据处理成功或失败后,执行回调。ExecutorDelivery类中postResponse方法,其中ExecutorDelivery是在RequestQueue中创建的

其中Handler 的创建是new Handler(Looper.getMainLooper())) , 这就是表示创建的Handler是会在UI线程中。


最后差不多结束, 有很多细节没有明确讲出来, 表达能力和组织能力不太好,第一次写博客!! 解读开源框架我一般的步骤都是:怎么使用----》了解整体的运行流程-----》了解细节---》全局的思考这样设计优势。  大概就这个步骤。  希望不喜欢的也勿喷, 有建议的可以交流, 大家共同进步。 从现在以后 还有定时写一些技术的博客。 谢谢各位浏览者。


0 0
原创粉丝点击