Android網(wǎng)絡(luò)框架-Volley(一) 工作原理分析

簡介:Volley 是 Google 推出的 Android異步網(wǎng)絡(luò)請(qǐng)求框架和圖片加載框架抬探。在 Google I/O 2013 大會(huì)上發(fā)布哲身,Volley 的特點(diǎn)-特別適合數(shù)據(jù)量小宋距,通信頻繁的網(wǎng)絡(luò)操作诚些。

相對(duì)比HttpURLConnection和HttpClient的用法還是稍微有些復(fù)雜的男韧,使用Volley可以讓我們輕輕松松的訪問網(wǎng)絡(luò)莉掂, 不用每次都寫大量重復(fù)的代碼葛圃,而且它是異步操作的,不用再我們?nèi)懏惒饺蝿?wù),這樣的代碼非常簡單库正,還有一個(gè)就是Volley是支持異步加載圖片并且有緩存機(jī)制曲楚,防止OOM發(fā)生,Volley把該該干的全部都干了褥符,只需要我們專注于自己的業(yè)務(wù)邏輯就可以龙誊,Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身。

配置Gradle:
compile 'com.mcxiaoke.volley:library:1.0.19'

下載Volley的源碼:
git clone https://android.googlesource.com/platform/frameworks/volley

下載Volley.jar 包:
[http://download.csdn.net/detail/sinyu890807/7152015]

簡單的看一下Volley-StringRequest一段請(qǐng)求數(shù)據(jù)的代碼:

private TextView tv_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_content = (TextView) findViewById(R.id.tv_content);
        //通過Volley.newRequestQueue就可以非常簡單的創(chuàng)建出一個(gè)RequestQueue
        RequestQueue queue = Volley.newRequestQueue(this);
        //我們要請(qǐng)求的地址喷楣,這個(gè)地址會(huì)返回一些html數(shù)據(jù)
        String url = "http://www.baidu.com";
        //StringRequest是Volley提供的一個(gè)專門用于請(qǐng)求字符串類型數(shù)據(jù)的Request
        //第一個(gè)參數(shù)是要訪問的地址
        //第二個(gè)參數(shù)是一個(gè)回調(diào)接口趟大,在onResponse()方法里我們可以直接給textview設(shè)置內(nèi)容,因?yàn)閂olley將已經(jīng)加工好的數(shù)據(jù)直接返回給了主線程铣焊。
        //因此onResponse是工作在主線程的逊朽,我們可以直接更新UI
        //第三個(gè)參數(shù)是在出現(xiàn)錯(cuò)誤后的一個(gè)回調(diào)接口,在onErrorResponse()中我們可以得到錯(cuò)誤信息曲伊,他也是工作在主線程的
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                tv_content.setText(response);
            }
            
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                tv_content.setText("出錯(cuò)了"+error.getMessage());
            }
        });
        //將這個(gè)Request添加到RequestQueue中叽讳,Volley就開始工作了
        queue.add(stringRequest);
    }

另外,由于Volley是要訪問網(wǎng)絡(luò)的熊昌,因此不要忘記在你的AndroidManifest.xml中添加如下權(quán)限:
<uses-permission android:name="android.permission.INTERNET" />

Volley的工作流程:

20150710134111425.png
其中藍(lán)色的是主線程绽榛,綠色的是緩存線程湿酸,黃色的是網(wǎng)絡(luò)線程
  • .當(dāng)一個(gè)Request請(qǐng)求添加到RequestQueue請(qǐng)求隊(duì)列中婿屹,Volley就開始工作了。RequestQueue請(qǐng)求隊(duì)列中持有一個(gè)CacheDispatcher緩存管家和一組NetworkDispatcher網(wǎng)絡(luò)管家推溃。
  • .RequestQueue會(huì)先叫來CacheDispatcher緩存管家昂利,讓他去看看,當(dāng)前請(qǐng)求的數(shù)據(jù)在沒在cache中铁坎。
    • .當(dāng)前的數(shù)據(jù)在cache中蜂奸,那就把數(shù)據(jù)從cache中取出來,然后經(jīng)過一番加工硬萍,將加工好的數(shù)據(jù)交付給主線程
    • .當(dāng)前數(shù)據(jù)沒在cache中扩所,進(jìn)行第3步
  • .進(jìn)行到了這一步,那肯定是數(shù)據(jù)沒有在緩存中朴乖,那只能去網(wǎng)絡(luò)中獲取了祖屏,這時(shí)候RequestQueue會(huì)叫來NetworkDispatcher,NetworkDispatcher可是有一幫呢买羞,其實(shí)這是一個(gè)線程池袁勺,默認(rèn)情況下會(huì)啟動(dòng)4個(gè)線程去網(wǎng)絡(luò)下載數(shù)據(jù)。所以RequestQueue把當(dāng)前閑著的NetworkDispatcher叫來畜普,給他們分配任務(wù)期丰。
  • .拿到任務(wù)的NetworkDispatcher就會(huì)去網(wǎng)絡(luò)上下載數(shù)據(jù)了,與此同時(shí),他會(huì)判斷下載到的數(shù)據(jù)能否寫入到cache緩存中钝荡,如果可以的話就寫入cache街立,以便于下一次直接從cache中獲取到數(shù)據(jù)。最后化撕,將數(shù)據(jù)加工几晤,交付給主線程。
    一個(gè)宏觀的Volley工作流程就分析完了植阴,有了對(duì)Volley的一個(gè)初步認(rèn)識(shí)蟹瘾,我們基本可以判斷他能否應(yīng)用到我們的項(xiàng)目中去了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掠手,一起剝皮案震驚了整個(gè)濱河市憾朴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喷鸽,老刑警劉巖众雷,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異做祝,居然都是意外死亡砾省,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門混槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來编兄,“玉大人,你說我怎么就攤上這事声登『菰В” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵悯嗓,是天一觀的道長件舵。 經(jīng)常有香客問我,道長脯厨,這世上最難降的妖魔是什么铅祸? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮合武,結(jié)果婚禮上临梗,老公的妹妹穿的比我還像新娘。我一直安慰自己眯杏,他們只是感情好夜焦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岂贩,像睡著了一般茫经。 火紅的嫁衣襯著肌膚如雪巷波。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天卸伞,我揣著相機(jī)與錄音抹镊,去河邊找鬼。 笑死荤傲,一個(gè)胖子當(dāng)著我的面吹牛垮耳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遂黍,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼终佛,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了雾家?” 一聲冷哼從身側(cè)響起铃彰,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芯咧,沒想到半個(gè)月后牙捉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敬飒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年邪铲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无拗。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡带到,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓝纲,到底是詐尸還是另有隱情阴孟,我是刑警寧澤晌纫,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布税迷,位于F島的核電站,受9級(jí)特大地震影響锹漱,放射性物質(zhì)發(fā)生泄漏箭养。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一哥牍、第九天 我趴在偏房一處隱蔽的房頂上張望毕泌。 院中可真熱鬧,春花似錦嗅辣、人聲如沸撼泛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿题。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潘酗,已是汗流浹背杆兵。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仔夺,地道東北人琐脏。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像缸兔,于是被迫代替她去往敵國和親日裙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容