Android 網(wǎng)絡(luò)通信框架Volley的二次封裝

在Android開發(fā)中不可避免地需要用到網(wǎng)絡(luò)訪問辫愉,多數(shù)情況下會使用HTTP協(xié)議來發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)墨榄。Android系統(tǒng)中主要提供了兩種方式來進(jìn)行HTTP通信:HttpURLConnection和HttpClient草冈。

HttpURLConnection和HttpClient的用法還是稍微有些復(fù)雜,如果沒有進(jìn)行封裝的話停局,很容易寫出不少重復(fù)代碼稚茅。這時就出現(xiàn)很多Android網(wǎng)絡(luò)通信框架,比如AsyncHttpClient袱院,它把HTTP所有的通信細(xì)節(jié)全部封裝在了內(nèi)部屎慢,我們只需要簡單調(diào)用幾行代碼就可以完成通信操作了瞭稼。比如Universal-Image-Loader,它使得在界面上顯示網(wǎng)絡(luò)圖片的操作變得極度簡單腻惠,因?yàn)閁niversal-Image-Loader已經(jīng)把一切都做好了环肘,我們不用關(guān)心如何從網(wǎng)絡(luò)上獲取圖片,也不用關(guān)心開啟線程妖枚、回收圖片資源等廷臼。

而當(dāng)前十分熱門的Volley網(wǎng)絡(luò)框架,也是在2013年Google I/O大會上推出了一個新的網(wǎng)絡(luò)通信框架绝页。Volley把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身荠商,既可以像AsyncHttpClient一樣非常簡單地進(jìn)行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片续誉。

本身已有良好封裝的Volley確實(shí)給程序開發(fā)帶來了很多便利與快捷莱没,但我們?nèi)匀豢梢詫olley進(jìn)行二次封裝。
由于需要用到網(wǎng)絡(luò)訪問酷鸦,所以不要忘記添加權(quán)限哦

<uses-permission android:name="android.permission.INTERNET" />

首先我們創(chuàng)建一個類繼承Application并在AndroidManifest.xml文件中的application標(biāo)簽中進(jìn)行注冊饰躲,在我們創(chuàng)建的Application中通過Volley.newRequestQueue(getApplicationContext())獲取 RequestQueue對象。

package com.xiaolijuan.volleydome;

import android.app.Application;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * @author: xiaolijuan
 * @description:
 * @date: 2016-03-11
 * @time: 11:34
 */
public class AppApplication extends Application {

    public static RequestQueue queues;

    @Override
    public void onCreate() {
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueues() {
        return queues;
    }
}

HttpUtils.java

package com.xiaolijuan.volleydome.network;

import android.content.Context;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.Request.Method;
import com.android.volley.toolbox.StringRequest;
import com.xiaolijuan.volleydome.AppApplication;

import java.util.Map;

/**
 * @author: xiaolijuan
 * @description: 使用Volley訪問Http請求管理的工具類
 * @date: 2016-03-15
 * @time: 15:39
 */
public class HttpUtils {
    public static StringRequest stringRequest;

    /**
     * Get請求臼隔,獲得返回?cái)?shù)據(jù)
     *
     * @param context 上下文
     * @param url     發(fā)送請求的URL
     * @param tag     TAG標(biāo)簽
     * @param vif     請求回調(diào)的接口(請求成功或者失斷诹选)
     */
    public static void doGet(Context context, String url, String tag, VolleyInterface vif) {
        Log.e("發(fā)送Get請求的URL:", url);
        //獲取全局的請求隊(duì)列并把基于Tag標(biāo)簽的請求全部取消,防止重復(fù)請求
        AppApplication.getHttpQueues().cancelAll(tag);
        //實(shí)例化StringRequest
        stringRequest = new StringRequest(Method.GET, url, vif.loadingListener(), vif.errorListener());
        // 設(shè)置標(biāo)簽
        stringRequest.setTag(tag);
        // 將請求添加至隊(duì)列里面
        AppApplication.getHttpQueues().add(stringRequest);
        // 啟動
        AppApplication.getHttpQueues().start();
    }

    /**
     * 向指定 URL 發(fā)送POST方法的請求
     *
     * @param context 上下文
     * @param url     發(fā)送請求的URL
     * @param tag     TAG標(biāo)簽
     * @param params  請求參數(shù)摔握,請求參數(shù)應(yīng)該是Hashmap類型
     * @param vif     請求回調(diào)的接口(請求成功或者失敿睦恰)
     */
    public static void doPost(Context context, String url, String tag, final Map<String, String> params,
                              VolleyInterface vif) {
        Log.e("發(fā)送Get請求的URL:", url);
        //獲取全局的請求隊(duì)列并把基于Tag標(biāo)簽的請求全部取消,防止重復(fù)請求
        AppApplication.getHttpQueues().cancelAll(tag);
        stringRequest = new StringRequest(url, vif.loadingListener(), vif.errorListener()) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        // 設(shè)置標(biāo)簽
        stringRequest.setTag(tag);
        // 加入隊(duì)列
        AppApplication.getHttpQueues().add(stringRequest);
        // 啟動
        AppApplication.getHttpQueues().start();
    }
}

VolleyInterface.java

package com.xiaolijuan.volleydome.network;

import android.content.Context;
import android.util.Log;

import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;

/**
 * @author: xiaolijuan
 * @description: 請求成功或失敗的接口回調(diào)
 * @date: 2016-03-15
 * @time: 15:39
 */
public abstract class VolleyInterface {
    /**
     * 上下文
     */
    public Context mContext;
    /**
     * 請求成功監(jiān)聽
     */
    public static Listener<String> mListener;
    /**
     * 請求失敗監(jiān)聽
     */
    public static ErrorListener mErrorListtener;

    public VolleyInterface(Context context, Listener<String> listener, ErrorListener errorListener) {
        this.mContext = context;
        this.mListener = listener;
        this.mErrorListtener = errorListener;
    }

    /**
     * 請求成功的抽象類
     *
     * @param result
     */
    public abstract void onSuccess(String result);

    /**
     * 請求失敗的抽象類
     *
     * @param error
     */
    public abstract void onError(VolleyError error);

    /**
     * 請求成功監(jiān)聽
     *
     * @return
     */
    public Listener<String> loadingListener() {
        mListener = new Listener<String>() {

            @Override
            public void onResponse(String result) {
                Log.e("請求成功返回的數(shù)據(jù):", result);
                onSuccess(result);
            }
        };
        return mListener;
    }

    /**
     * 請求失敗監(jiān)聽
     *
     * @return
     */
    public ErrorListener errorListener() {
        mErrorListtener = new ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("請求失敗返回的數(shù)據(jù):", error.toString());
                onError(error);
            }
        };
        return mErrorListtener;
    }
}

由于代碼寫得很詳細(xì)氨淌,我這里就不再一一解釋啦

package com.xiaolijuan.volleydome;

import android.app.Activity;
import android.os.Bundle;

import com.android.volley.VolleyError;
import com.xiaolijuan.volleydome.network.HttpUtils;
import com.xiaolijuan.volleydome.network.VolleyInterface;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doGet();
    }

    private void doGet() {
        String url = "";
        String tag = "GET";
        HttpUtils.doGet(getApplicationContext(), url, tag,
                new VolleyInterface(getApplicationContext(), VolleyInterface.mListener, VolleyInterface.mErrorListtener) {

                    @Override
                    public void onSuccess(String result) {
                    }

                    @Override
                    public void onError(VolleyError error) {
                    }
                });
    }

    /**
     * volley和activity的關(guān)聯(lián)
     */
    @Override
    protected void onStop() {
        super.onStop();
        // 在停止的時候也把tag標(biāo)簽的網(wǎng)絡(luò)請求給停掉
        AppApplication.getHttpQueues().cancelAll("");
    }
}

本篇博客在這里就結(jié)束了泊愧,有不足的地方還望各路大神指導(dǎo) ,謝謝盛正!

源碼請點(diǎn)擊這里:Android 網(wǎng)絡(luò)通信框架Volley的二次封裝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末删咱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豪筝,更是在濱河造成了極大的恐慌痰滋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壤蚜,死亡現(xiàn)場離奇詭異即寡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)袜刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門聪富,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人著蟹,你說我怎么就攤上這事墩蔓∩颐В” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵奸披,是天一觀的道長昏名。 經(jīng)常有香客問我,道長阵面,這世上最難降的妖魔是什么轻局? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮样刷,結(jié)果婚禮上仑扑,老公的妹妹穿的比我還像新娘。我一直安慰自己置鼻,他們只是感情好镇饮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箕母,像睡著了一般储藐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘶是,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天钙勃,我揣著相機(jī)與錄音,去河邊找鬼聂喇。 笑死肺缕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的授帕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼浮梢,長吁一口氣:“原來是場噩夢啊……” “哼跛十!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秕硝,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芥映,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后远豺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈偏,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年躯护,在試婚紗的時候發(fā)現(xiàn)自己被綠了惊来。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡棺滞,死狀恐怖裁蚁,靈堂內(nèi)的尸體忽然破棺而出矢渊,到底是詐尸還是另有隱情,我是刑警寧澤枉证,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布矮男,位于F島的核電站,受9級特大地震影響室谚,放射性物質(zhì)發(fā)生泄漏毡鉴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一秒赤、第九天 我趴在偏房一處隱蔽的房頂上張望猪瞬。 院中可真熱鬧,春花似錦倒脓、人聲如沸撑螺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甘晤。三九已至,卻和暖如春饲做,著一層夾襖步出監(jiān)牢的瞬間线婚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工盆均, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塞弊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓泪姨,卻偏偏與公主長得像游沿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肮砾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 我們平時在開發(fā)Android應(yīng)用的時候不可避免地都需要用到網(wǎng)絡(luò)技術(shù)诀黍,而多數(shù)情況下應(yīng)用程序都會使用HTTP協(xié)議來發(fā)送...
    WeiAai閱讀 408評論 0 2
  • 昨天剛下課,就聽到樓道里吵吵嚷嚷仗处,看到高老師旁邊有一個女家長正在激動的說話眯勾,另外一個女家長也從樓道一端走過來,滿嘴...
    Green綠袖閱讀 222評論 0 0
  • 簾外天色烏婆誓。正月節(jié)吃环,傍晚時雨,泥濘滿途洋幻。 手把書本電話響郁轻,幾多憂愁頓時無。 儂輕問鞋屈,君家何處范咨? 君言不必勞心記故觅,待...
    松筠深鎖閱讀 597評論 2 5
  • 初初聽到時,心里的確很不高興渠啊,但不高興的是自己输吏,別人是不會不高興的,所以替蛉,自己呀贯溅,也不要不高興了。心情是自己的躲查,怎...
    飲雨秋寒閱讀 93評論 0 0