中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Volley源碼如何使用

發布時間:2021-08-09 10:51:42 來源:億速云 閱讀:139 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“Volley源碼如何使用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Volley源碼如何使用”這篇文章吧。

概述

Volley是Google在2013年推出的一個網絡庫,用于解決復雜網絡環境下網絡請求問題。剛推出的時候是非常火的,現在該項目的變動已經很少了。項目庫地址為https://android.googlesource.com/platform/frameworks/volley

通過提交歷史可以看到,最后一次修改距離今天已經有一段時間了。而volley包的release版本也已經很久沒有更新了。

author JeffDavidson<jpd@google.com> SunMar1316:35:592016+0000雖然很久沒有更新了,Volley始終是一個很好的網絡框架,我們來分析一下volley的源碼,更好的了解volley的使用場景,設計模式,還有存在的一些小問題,或者說使用不當出現的問題。

創建RequestQueue

下面的代碼片段展示了建立一個RequestQueue需要的步驟:

// 使用 cache 和 network初始化 RequestQueue
mRequestQueue = new RequestQueue(cache, network);

// 啟動隊列
mRequestQueue.start();

String url ="http://www.example.com";

// 明確描述請求(request)并處理響應(response)
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
    new Response.Listener<String>() {
  @Override
  public void onResponse(String response) {
    // 處理響應信息
  }
},
  new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
      // Handle error
  }
});

// 添加request 到 RequestQueue.
mRequestQueue.add(stringRequest);

// ...

Volley類實質上只提供了一個方法newRequestQueue,用來創建RequestQueue,RequestQueue是volley的請求隊列,mCurrentRequests中存儲了執行中的和將要執行的請求,DEFAULT_NETWORK_THREAD_POOL_SIZE是一個常量4。

可以通過RequestQueue的publicRequestQueue(Cachecache,Networknetwork,intthreadPoolSize)這個方法修改線程數量,默認開啟4個線程,然后一直子后臺運行。這里需要注意一下在調用Volley的RequestQueue的時候,內部已經調用了RequestQueue的start方法,不需要再次調用。如果自己創建RequestQueue需要自行調用start方法,整個APP的生命周期中使用一次即可。多次調用會增加線程開銷,每次調用start方法,都會調用stop方法終止原來的線程,然后重新開啟新的線程。

正常使用volley后臺請求線程數量是固定的,默認4個并發不需要修改,可能是基于這個考慮,并沒有使用Executor線程池,線程池的考慮本身是為了管理線程頻繁創建,避免過多開銷的。默認始終4個線程,不存在過度開銷問題。個人感覺這里使用線程池會更好一些,當然引入線程池復雜度一定會增加。始終只有4個線程也引發了一些問題,使volley在某些場景不適用。如果請求服務器響應時間太長,4個線程都會處于阻塞狀態,這個時候新來的請求只能等待,不能直接執行。volley是比較適合輕量級請求,請求頻繁,請求時間短。

/** Number of network request dispatcher threads to start. */ 
private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 4;
public RequestQueue(Cache cache, Network network) { 
  this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE); 
}
Network network = new BasicNetwork(stack); 
 
   RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); 
   queue.start();

請求執行者HttpStack

HttpStack是真正執行網絡請求的接口,performRequest方法執行請求,源碼中有兩個實現,一個是HurlStack,另一個是HttpClientStack,SDK版本大于等于9使用的是HurlStack。

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)); 
   } 
 }

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現類,它們都擁有眾多的API,而且實現比較穩定,bug數量也很少。但同時也由于HttpClient的API數量過多,使得我們很難在不破壞兼容性的情況下對它進行升級和擴展,所以目前Android團隊在提升和優化HttpClient方面的工作態度并不積極。

HttpURLConnection是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用于大多數的應用程序。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴展它。不過在Android2.2版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream調用close方法時,就有可能會導致連接池失效了。那么我們通常的解決辦法就是直接禁用掉連接池的功能。Android2.3版本之前HttpURLConnection存在bug不建議使用,而在Android2.3版本及以后,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,因而非常適用于Android項目。壓縮和緩存機制可以有效地減少網絡訪問的流量,在提升速度和省電方面也起到了較大的作用。

目前來說,我們有一個更好的請求選擇okhttp,volley源碼中并沒有封裝它的請求,我們可以自己實現HttpStack接口,在performRequest使用okhttp請求。OkHttp相較于其它的實現有以下的優點:支持SPDY,允許連接同一主機的所有請求分享一個socket。如果SPDY不可用,會使用連接池減少請求延遲。使用GZIP壓縮下載內容,且壓縮操作對用戶是透明的。利用響應緩存來避免重復的網絡請求。當網絡出現問題的時候,OKHttp會依然有效,它將從常見的連接問題當中恢復。如果你的服務端有多個IP地址,當第一個地址連接失敗時,OKHttp會嘗試連接其他的地址,這對IPV4和IPV6以及寄宿在多個數據中心的服務而言,是非常有必要的。使用OkHttp作為替代是一個很好的選擇。

緩存與線程處理

剛才說有4個默認線程是不準確的,是有4個NetworkDispatcher執行網絡請求,還有一個CacheDispatcher緩存線程,本地緩存策略需要實現Cache接口,源碼中有兩個實現DiskBasedCache,NoCache,默認使用的是DiskBasedCache。我們可以根據自己的需要實現Cache接口。DiskBasedCache默認路徑是app緩存目錄下的volley,默認緩存5M,超出之后會覆蓋舊數據。

Request類

Request類的子類相當于volley的輸入,是創建請求的時候用的。JsonObjectRequest、JsonArrayRequest用來處理返回是json的數據,StringRequest處理stirng,ImageRequest用來處理圖片。

Volley其實是一個生產者和消費者系統,調用方是生產者,而Volley是消費者。調用方通過RequestQueue生產Request,而Vollery消費Request從而得到Response。那么負責調配這些生產者和消費者的就是Dispatcher,分別是Cache和Network的Dispatcher。

以上是“Volley源碼如何使用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湟源县| 麦盖提县| 宝坻区| 弋阳县| 霍山县| 巴彦县| 抚宁县| 噶尔县| 烟台市| 额尔古纳市| 肇州县| 郸城县| 清原| 湖北省| 彰化市| 盘山县| 清水县| 奉贤区| 通河县| 磐石市| 宿州市| 宁安市| 厦门市| 绥化市| 乌海市| 收藏| 清徐县| 北川| 滦南县| 肥乡县| 普宁市| 镇赉县| 金坛市| 互助| 西乌| 水富县| 沙洋县| 丰台区| 鄱阳县| 广西| 双城市|