Volley源碼分析(一)

1.Volley源碼分析(一)
2.Volley源碼分析(二)
3.Volley源碼分析(三)
4.XVolley-基于Volley的封裝的工具類

第一次一行一行讀源碼,記錄下來盏筐,慢慢來

1.Volley.class

用過Volley的都知道使用Volley的第一步需要使用Volley.newRequestQueue方法創(chuàng)建一個RequestQueue围俘。所以就從這開始吧。
public class Volley {

/** Default on-disk cache directory. */
private static final String DEFAULT_CACHE_DIR = "volley";

/**
 * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
 *
 * @param context A {@link Context} to use for creating the cache dir.
 * @param stack An {@link HttpStack} to use for the network, or null for default.
 * @return A started {@link RequestQueue} instance.
 */
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
    //建立緩存
    File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

    String userAgent = "volley/0";
    try {
        String packageName = context.getPackageName();
        PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
        userAgent = packageName + "/" + info.versionCode;
    } catch (NameNotFoundException e) {
    }

    /**
     * 策略模式
     */
    if (stack == null) {
        if (Build.VERSION.SDK_INT >= 9) {
            //大于2.3則建立HurlStack
            stack = new HurlStack();
        } else {
            // Prior to Gingerbread, HttpUrlConnection was unreliable.
            // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
            //小于2.3版本則建立HttpClientStack
            stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
        }
    }

    /**
     * 創(chuàng)建一個網絡請求
     */
    Network network = new BasicNetwork(stack);

    /**
     * 這里每次都會創(chuàng)建一個請求隊列
     */
    RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
    queue.start();

    return queue;
}

/**
 * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
 *
 * @param context A {@link Context} to use for creating the cache dir.
 * @return A started {@link RequestQueue} instance.
 */
public static RequestQueue newRequestQueue(Context context) {
    return newRequestQueue(context, null);
}

}
首先大體看琢融,這里newRequestQueue方法使用了重載界牡,提供兩種方式創(chuàng)建RequestQueue。實際上最后執(zhí)行的都是newRequestQueue(Context context, HttpStack stack)方法漾抬。詳細看下這個方法宿亡。

第一步

建立緩存,可以看到這里利用文件流建立了緩存纳令。

第二步

這里是個重點挽荠,當沒有HttpStack == null時,這里對版本進行了判斷平绩,大于等于2.3則創(chuàng)建HurlStack,小于則創(chuàng)建HttpClientStack圈匆。兩種的區(qū)別網上可以搜,大體就是2.3前HttpClientStack使用的HttpClient擁有較少的bug馒过,2.3以后HttpURLConnection擁有更小的體積臭脓,更多的api,更多的優(yōu)化腹忽。
tips:記得這里曾經有一次面試問到用到了什么設計模式来累,現(xiàn)在補一下砚作,用到了策略模式
這里分析一下:
HttpStack.class

public interface HttpStack {
    /**
     * Performs an HTTP request with the given parameters.
     *
     * <p>A GET request is sent if request.getPostBody() == null. A POST request is sent otherwise,
     * and the Content-Type header is set to request.getPostBodyContentType().</p>
     *
     * @param request the request to perform
     * @param additionalHeaders additional headers to be sent together with
     *         {@link Request#getHeaders()}
     * @return the HTTP response
     */
    HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
        throws IOException, AuthFailureError;

}

可以看到HttpStack是一個接口嘹锁,定義了performRequest方法葫录,而HurlStack和HttpClientStack則實現(xiàn)了這個接口,分別實現(xiàn)了不同的實現(xiàn)方式领猾。對應在不同的版本判斷時調用將實現(xiàn)不同的類米同。這里提供下《HeadFrist 設計模式》讀書筆記 —— 策略模式博客里面的類圖

這里寫圖片描述

所有綜上所述,這里用到的是策略模式摔竿。

第三步

創(chuàng)建了一個網絡請求面粮,這個后面會分析這兩個類,現(xiàn)在只要知道這個類的作用是真正執(zhí)行網絡請求的地方继低。

第四步

創(chuàng)建了一個請求隊列熬苍,并執(zhí)行請求隊列的start方法。這里可以看到每次都會創(chuàng)建一個請求隊列其實不是特別合適的袁翁,這里可以考慮優(yōu)化使用單例模式公用一個隊列

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柴底,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粱胜,更是在濱河造成了極大的恐慌柄驻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焙压,死亡現(xiàn)場離奇詭異鸿脓,居然都是意外死亡,警方通過查閱死者的電腦和手機冗恨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門答憔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掀抹,你說我怎么就攤上這事虐拓。” “怎么了傲武?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵蓉驹,是天一觀的道長。 經常有香客問我揪利,道長态兴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任疟位,我火速辦了婚禮瞻润,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己绍撞,他們只是感情好正勒,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傻铣,像睡著了一般章贞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上非洲,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天鸭限,我揣著相機與錄音,去河邊找鬼两踏。 笑死败京,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缆瓣。 我是一名探鬼主播喧枷,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弓坞!你這毒婦竟也來了?” 一聲冷哼從身側響起车荔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渡冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忧便,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族吻,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年珠增,在試婚紗的時候發(fā)現(xiàn)自己被綠了超歌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒂教,死狀恐怖巍举,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情凝垛,我是刑警寧澤懊悯,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梦皮,受9級特大地震影響炭分,放射性物質發(fā)生泄漏。R本人自食惡果不足惜剑肯,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一捧毛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦呀忧、人聲如沸型将。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽七兜。三九已至,卻和暖如春福扬,著一層夾襖步出監(jiān)牢的瞬間腕铸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工铛碑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狠裹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓汽烦,卻偏偏與公主長得像涛菠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撇吞,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容