【譯】Volley官方文檔三:建立一個RequestQueue

原文鏈接:Setting Up a RequestQueue

這節(jié)課教你:

  • 建立一個Network和Cache
  • 使用單例模式

先前的教程教你如何使用Volley.newRequestQueue這個便捷的方法類建立一個RequestQueue彭谁,使用Volley的默認(rèn)行為(譯注:默認(rèn)值)闺魏。這節(jié)課帶你通過明確的步驟來創(chuàng)建一個RequestQueue史辙,你可以使用自定義的行為(譯注:自定義值)。

這節(jié)課還要闡述創(chuàng)建一個RequestQueue的推薦實踐误证,就是單例漂彤,它使得RequestQueue與app的生命周期相伴弦牡。

建立一個Network和Cache

RequestQueue 需要兩個東西才能工作:一個是network來完成request的傳輸兼都,另一個是cache來處理緩存。在Volley的工具箱中對這些有標(biāo)準(zhǔn)的實現(xiàn):DiskBasedCache提供了每個響應(yīng)一個文件的緩存套媚,使用內(nèi)存中索引缚态,BasicNetwork提供了一個基于你優(yōu)選的HTTP客戶端的網(wǎng)絡(luò)傳輸。

BasicNetwork是Volley的默認(rèn)網(wǎng)絡(luò)實現(xiàn)堤瘤。BasicNetwork必須被你的app連接網(wǎng)絡(luò)所使用的HTTP客戶端初始化玫芦。典型情況是HttpURLConnection

下面的代碼片段展示了建立一個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);

// ...

如果你只是產(chǎn)生一次性的request而不想留下線程池,你可以使用Sending a Simple Request中描述的Volley.newRequestQueue()在任何你需要的地方創(chuàng)建RequestQueue 本辐,然后一旦響應(yīng)或錯誤返回了桥帆,在RequestQueue調(diào)用stop()。但是更普遍的用法是使用單例創(chuàng)建RequestQueue师郑,讓RequestQueue伴隨著app的生命周期一直運(yùn)行环葵,這個在下一個部分討論。

使用單例模式

如果你的應(yīng)用需要經(jīng)常使用網(wǎng)絡(luò)宝冕,那么創(chuàng)建單例的RequestQueue會更高效张遭。你可以通過多種方式實現(xiàn)。推薦的方式是實現(xiàn)一個單例類來封裝RequestQueue和其它的Volley有的功能地梨。另一種方式是繼承Application并在Application.onCreate()方法中構(gòu)建RequestQueue菊卷。但是我們不鼓勵這樣做。一個靜態(tài)的單例能夠更加模塊化地提供相同的功能宝剖。

關(guān)鍵的是RequestQueue必須用Application的context來初始化洁闰,而不是Activity的context。這樣才能保證RequestQueue能夠伴隨著應(yīng)用的生命周期存在万细,而不是隨著activity的每次重建而重建(比如扑眉,當(dāng)用戶旋轉(zhuǎn)設(shè)備)。

下面是一個單例類的例子赖钞,提供了RequestQueueImageLoader的功能:

public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);

            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        });
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() 是關(guān)鍵, 它避免了你
            //傳遞進(jìn)Activity或BroadcastReceiver導(dǎo)致的內(nèi)存泄漏
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

下面是使用單例類來執(zhí)行RequestQueue操作的例子:

// 獲取一個RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();

// ...

// 添加一個request (示例中為 stringRequest) 到RequestQueue中
MySingleton.getInstance(this).addToRequestQueue(stringRequest);

項目源碼下載點擊下載


系列索引


更新日志 ↓ ↓ ↓

  • 2016年03月21日:添加了系列索引
  • 2016年03月20日
    - 翻譯了代碼中的英文
    - 添加了源碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰素,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雪营,更是在濱河造成了極大的恐慌弓千,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件献起,死亡現(xiàn)場離奇詭異洋访,居然都是意外死亡镣陕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門姻政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呆抑,“玉大人,你說我怎么就攤上這事扶歪±矸危” “怎么了摄闸?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵善镰,是天一觀的道長。 經(jīng)常有香客問我年枕,道長炫欺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任熏兄,我火速辦了婚禮品洛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摩桶。我一直安慰自己桥状,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布硝清。 她就那樣靜靜地躺著辅斟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芦拿。 梳的紋絲不亂的頭發(fā)上士飒,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音蔗崎,去河邊找鬼酵幕。 笑死,一個胖子當(dāng)著我的面吹牛缓苛,可吹牛的內(nèi)容都是我干的芳撒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼未桥,長吁一口氣:“原來是場噩夢啊……” “哼笔刹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钢属,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徘熔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淆党,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酷师,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡讶凉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了山孔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂讯。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖台颠,靈堂內(nèi)的尸體忽然破棺而出褐望,到底是詐尸還是另有隱情,我是刑警寧澤串前,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布瘫里,位于F島的核電站,受9級特大地震影響荡碾,放射性物質(zhì)發(fā)生泄漏谨读。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一坛吁、第九天 我趴在偏房一處隱蔽的房頂上張望劳殖。 院中可真熱鬧,春花似錦拨脉、人聲如沸哆姻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矛缨。三九已至,卻和暖如春匆骗,著一層夾襖步出監(jiān)牢的瞬間劳景,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工碉就, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留盟广,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓瓮钥,卻偏偏與公主長得像筋量,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碉熄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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