最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Volley源碼之使用方式和使用場景詳解

 更新時間:2017年11月25日 09:57:04   作者:robert_chao  
這篇文章主要介紹了Volley源碼之使用方式和使用場景詳解,具有一定參考價值,需要的朋友可以了解下。

概述

Volley是Google在2013年推出的一個網(wǎng)絡(luò)庫,用于解決復(fù)雜網(wǎng)絡(luò)環(huán)境下網(wǎng)絡(luò)請求問題。剛推出的時候是非常火的,現(xiàn)在該項目的變動已經(jīng)很少了。項目庫地址為https://android.googlesource.com/platform/frameworks/volley

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

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

創(chuàng)建RequestQueue

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

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

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

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

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

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

// ...

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

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

正常使用volley后臺請求線程數(shù)量是固定的,默認(rèn)4個并發(fā)不需要修改,可能是基于這個考慮,并沒有使用Executor線程池,線程池的考慮本身是為了管理線程頻繁創(chuàng)建,避免過多開銷的。默認(rèn)始終4個線程,不存在過度開銷問題。個人感覺這里使用線程池會更好一些,當(dāng)然引入線程池復(fù)雜度一定會增加。始終只有4個線程也引發(fā)了一些問題,使volley在某些場景不適用。如果請求服務(wù)器響應(yīng)時間太長,4個線程都會處于阻塞狀態(tài),這個時候新來的請求只能等待,不能直接執(zhí)行。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(); 

請求執(zhí)行者HttpStack

HttpStack是真正執(zhí)行網(wǎng)絡(luò)請求的接口,performRequest方法執(zhí)行請求,源碼中有兩個實現(xiàn),一個是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具體的實現(xiàn)類,它們都擁有眾多的API,而且實現(xiàn)比較穩(wěn)定,bug數(shù)量也很少。但同時也由于HttpClient的API數(shù)量過多,使得我們很難在不破壞兼容性的情況下對它進行升級和擴展,所以目前Android團隊在提升和優(yōu)化HttpClient方面的工作態(tài)度并不積極。

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

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

緩存與線程處理

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

Request類

Request類的子類相當(dāng)于volley的輸入,是創(chuàng)建請求的時候用的。JsonObjectRequest、JsonArrayRequest用來處理返回是json的數(shù)據(jù),StringRequest處理stirng,ImageRequest用來處理圖片。

Volley其實是一個生產(chǎn)者和消費者系統(tǒng),調(diào)用方是生產(chǎn)者,而Volley是消費者。調(diào)用方通過RequestQueue生產(chǎn)Request,而Vollery消費Request從而得到Response。那么負(fù)責(zé)調(diào)配這些生產(chǎn)者和消費者的就是Dispatcher,分別是Cache和Network的Dispatcher。

總結(jié)

以上就是本文關(guān)于Volley源碼之使用方式和使用場景詳解的全部內(nèi)容,希望對大家有所幫助。如有不足指出,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Android實現(xiàn)動態(tài)定值范圍效果的控件

    Android實現(xiàn)動態(tài)定值范圍效果的控件

    這篇文中給大家分享一個Android的控件,這個控件實現(xiàn)是一個可以動態(tài)選擇定值范圍的效果,實現(xiàn)后的效果很不錯,對大家日常開發(fā)或許有所幫助,感興趣的朋友們可以一起來看看。
    2016-09-09
  • ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面

    ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面

    這篇文章主要為大家詳細介紹了ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android中mvp模式使用實例詳解

    Android中mvp模式使用實例詳解

    MVP 是從經(jīng)典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負(fù)責(zé)邏輯的處理,Model提供數(shù)據(jù),View負(fù) 責(zé)顯示。接下來通過本文給大家分享Android中mvp模式使用實例詳解,一起看看吧
    2017-04-04
  • Android控制界面刷新技巧匯總

    Android控制界面刷新技巧匯總

    這篇文章主要為大家詳細介紹了Android控制界面刷新的小技巧,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android Studio中CodeStyle模板的配置方式

    Android Studio中CodeStyle模板的配置方式

    這篇文章主要介紹了Android Studio中CodeStyle模板的配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android AndroidX的遷移

    Android AndroidX的遷移

    這篇文章主要介紹了Android AndroidX的遷移,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Android桌面組件App Widget完整案例

    Android桌面組件App Widget完整案例

    這篇文章主要介紹了Android桌面組件App Widget完整案例,較為詳細的分析了Android桌面組件App Widget的功能、定義及實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Android動畫系列之屬性動畫的基本使用教程

    Android動畫系列之屬性動畫的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Android動畫系列教程之屬性動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Android textview 實現(xiàn)長按自由選擇復(fù)制功能的方法

    Android textview 實現(xiàn)長按自由選擇復(fù)制功能的方法

    下面小編就為大家?guī)硪黄狝ndroid textview 實現(xiàn)長按自由選擇復(fù)制功能的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • BroadcastReceiver靜態(tài)注冊案例詳解

    BroadcastReceiver靜態(tài)注冊案例詳解

    這篇文章主要為大家詳細介紹了BroadcastReceiver靜態(tài)注冊案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

临安市| 武定县| 德兴市| 武清区| 东阿县| 晋城| 大方县| 毕节市| 新闻| 襄汾县| 玉山县| 封开县| 曲阳县| 基隆市| 天台县| 金山区| 常德市| 新安县| 渝中区| 宜州市| 山东省| 乌兰浩特市| 阳东县| 胶南市| 进贤县| 海晏县| 建昌县| 册亨县| 博罗县| 长子县| 黔西| 吉木乃县| 德格县| 嵊州市| 南华县| 金山区| 东乡族自治县| 土默特右旗| 手游| 宜州市| 龙海市|