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

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

HttpURLConnection和HttpClient的用法還是稍微有些復(fù)雜,如果沒有進行封裝的話,很容易寫出不少重復(fù)代碼。這時就出現(xiàn)很多Android網(wǎng)絡(luò)通信框架,比如AsyncHttpClient,它把HTTP所有的通信細節(jié)全部封裝在了內(nèi)部,我們只需要簡單調(diào)用幾行代碼就可以完成通信操作了。比如Universal-Image-Loader,它使得在界面上顯示網(wǎng)絡(luò)圖片的操作變得極度簡單,因為Universal-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)點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片。

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

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

首先我們創(chuàng)建一個類繼承Application并在AndroidManifest.xml文件中的application標簽中進行注冊,在我們創(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請求,獲得返回數(shù)據(jù)
     *
     * @param context 上下文
     * @param url     發(fā)送請求的URL
     * @param tag     TAG標簽
     * @param vif     請求回調(diào)的接口(請求成功或者失敗)
     */
    public static void doGet(Context context, String url, String tag, VolleyInterface vif) {
        Log.e("發(fā)送Get請求的URL:", url);
        //獲取全局的請求隊列并把基于Tag標簽的請求全部取消,防止重復(fù)請求
        AppApplication.getHttpQueues().cancelAll(tag);
        //實例化StringRequest
        stringRequest = new StringRequest(Method.GET, url, vif.loadingListener(), vif.errorListener());
        // 設(shè)置標簽
        stringRequest.setTag(tag);
        // 將請求添加至隊列里面
        AppApplication.getHttpQueues().add(stringRequest);
        // 啟動
        AppApplication.getHttpQueues().start();
    }

    /**
     * 向指定 URL 發(fā)送POST方法的請求
     *
     * @param context 上下文
     * @param url     發(fā)送請求的URL
     * @param tag     TAG標簽
     * @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);
        //獲取全局的請求隊列并把基于Tag標簽的請求全部取消,防止重復(fù)請求
        AppApplication.getHttpQueues().cancelAll(tag);
        stringRequest = new StringRequest(url, vif.loadingListener(), vif.errorListener()) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        // 設(shè)置標簽
        stringRequest.setTag(tag);
        // 加入隊列
        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;
    }
}

由于代碼寫得很詳細,我這里就不再一一解釋啦

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標簽的網(wǎng)絡(luò)請求給停掉
        AppApplication.getHttpQueues().cancelAll("");
    }
}

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容