Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android應用】AS Volley網絡訪問 簡單的二次封裝

【Android應用】AS Volley網絡訪問 簡單的二次封裝

編輯:關於Android編程

1 -- Volley簡介

Android開發團隊也是意識到了有必要將HTTP的通信操作再進行簡單化,於是在2013年Google I/O大會上推出了一個新的網絡通信框架——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集於了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖片。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目標就是非常適合去進行數據量不大,但通信頻繁的網絡操作,而對於大數據量的網絡操作,比如說下載文件等,Volley的表現就會非常糟糕

2 -- Volley的使用相信很多博客上都有 ,在這裡我就不解釋 這裡我只說對Volley進行二次包裝(這裡說的是AS 手把手教你)

|-- 2.1首先導入Volley Jar包 AS左上角 File-->New-->New Module(出現對話框)

\

選擇Import.JAR/.AAR Package 然後點擊next

\

選擇你存放Volley Jar包的文件夾然後finish

|-- 2.2 到此還沒有完 然後點擊左上角File-->Project Structure

\

|-- 2.3點擊app -->Dependencies--->右上角的加號 -->選擇第三個

\

|-- 2.4出現如下對話框 點擊OK 至此Volley Jar包已經導入可以使用了

\

 

3 -- 使用

|-- 3.1我是將Volley封裝在BaseActivity中 項目中所有的Activity都繼承自BaseActivity 為了更好的使用BaseActivity 我聲明BaseActivity為抽象類 大家可以寫一些必要的抽象方法在裡面比如點擊事件 每個頁面都能用到 不多廢話上代碼

 

package com.android.app.application;

import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import java.util.HashMap;
import java.util.Map;

/**
 * @描述 基類
 */
public abstract class BaseActivity extends FragmentActivity implements
        View.OnClickListener {
    public static final String TAG = "BaseActivity";

    //請求超時時間
    protected static final int REQUEST_TIMEOUT = 10000;

    //Volley請求隊列
    protected RequestQueue mQueue;

    /**
     * 執行網絡請求,請求方式POST
     *
     * @param methodName 標記您的請求是在哪裡發出來的
     * @param hasDialog  是否包含進度條
     * @param url        訪問URL地址
     * @param context    上下文對象
     * @param param      參數 json
     */
    protected void executeRequestPost(String methodName, boolean hasDialog, boolean onRefresh, String url, Context context, final String param) {
        if (N.checkNet(context)) {
            if (hasDialog) {
                //在這裡做進度條處理
            }
            StringRequest request = new StringRequest(Request.Method.POST, url, requestListenerPost(methodName, hasDialog, onRefresh), errorListenerPost(methodName, hasDialog, onRefresh)) {

                protected Map getParams()
                        throws AuthFailureError {
                    Map params = new HashMap();
                    //這裡放您要傳遞給服務器的參數 我這裡是組織成Json格式傳到服務器
                    params.put("param", param);
                    return params;
                }

                //請求連接超時 重新請求
                public RetryPolicy getRetryPolicy() {
                    return new DefaultRetryPolicy(REQUEST_TIMEOUT,
                            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
                }

            };
            //保證對象唯一
            VolleySingle.getVolleySingle(context.getApplicationContext()).addToRequestQueue(request);


        } else {
            Log.i(TAG, "沒有檢測到網絡");
        }
    }

    /**
     * @param hasDialog 是否有進度條
     * @return String 請求結果
     * @描述 Volley請求成功 POST
     */
    protected Response.Listener requestListenerPost(final String methodName, final boolean hasDialog, final boolean onRefresh) {
        return new Response.Listener() {

            @Override
            public void onResponse(String response) {
                Log.i(TAG, "執行網絡請求成功 POST");
                //網絡請求成功之後 服務器返回的json數據 會全部存在 response裡,直接去解析它就可以了
                onHandleResponsePost(methodName, response);
            }
        };
    }

    /**
     * @param hasDialog
     * @return 錯誤信息
     * @描述 Volley 網絡請求失敗 PSOT
     */
    protected Response.ErrorListener errorListenerPost(String methodName, final boolean hasDialog, final boolean onRefresh) {
        return new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //網絡請求失敗 或者錯誤 在這裡做相應的處理
                Log.i(TAG, "網絡請求錯誤 ");

            }
        };
    }

    /**
     * @param response
     * @param methodName 這裡就是Volley所做的標記 您可以根據這個標記去做相應處理
     * @描述 請求成功 處理數據 PSOT
     */
    protected void onHandleResponsePost(String methodName, String response) {
        
    }
}

 

|-- 3.2VolleySingle 因為您的App中要經常用到網絡請求,所以最好把Volley單利出來,但是我寫的單利模式有點問題,如果需要請改成餓漢模式 我就懶得動了 (*^__^*) 嘻嘻……

 

package com.android.app.application;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;

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

/**
 * Created by Google on 2016/6/3.
 *
 * @描述 Volley 統一管理類 單利懶漢
 */
public class VolleySingle {
    private static VolleySingle volleySingleton;
    private RequestQueue mRequestQueue;
    private Context mContext;
    private VolleySingle(){}

    public VolleySingle(Context context) {
        this.mContext = context;
        mRequestQueue = getRequestQueue();
    }

    public static synchronized VolleySingle getVolleySingle(Context context) {
        if (volleySingleton == null) {

            volleySingleton = new VolleySingle(context);
        }
        return volleySingleton;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
        }
        return mRequestQueue;
    }

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

 


|-- 3.3接下來就說說在你的Activity中如何使用 (下面兩個方法都是在你正常的訪問Activity中使用的)

 

 

 @Override
    protected void onNetRequest() {
        //不要在意這句話
        phone_number = getLoginState();
        //這裡用的阿裡巴巴的json 雖然有人說慢但我也看不出來 可能是老了...
        //這裡要注意的是 阿裡巴巴的Json解析也是一個Jar包 按照我上面說的方法就可以添加到項目中
        jsonObject = new JSONObject();
        jsonObject.put(Constants.TYPE, Constants.COLLECTION_QUERY);
        jsonObject.put(Constants.UNITCODE, Constants.UNITCOD_VALUE);
        jsonObject.put(Constants.PHONENUMBER, phone_number);
        jsonObject.put(Constants.COLOBJTYPE, Constants.BUSLINE);
        //轉化成Json格式
        String param = jsonObject.toJSONString();
        executeRequestPost(Constants.COLLECTION_QUERY, false, false, Constants.BASE_URL, getApplicationContext(), param);

    }

|-- 3.4處理響應 這個方法是覆蓋了父類的方法 記得要加super()啊 別手抖給扔了

 

 

 @Override
    protected void onHandleResponsePost(String methodName, String response) {
        super.onHandleResponsePost(methodName, response);
        if (methodName.equals(Constants.COLLECTION_QUERY)) {
            //這句是json解析 阿裡巴巴的 是不是很方便
            BusLineCollection bean = JSON.parseObject(response, BusLineCollection.class);
            if (bean.CODE.equals(getResources().getString(R.string.One)) && bean.MSG.equals("成功")) {

                entity = bean.data;
                if (entity != null) {
                    refreshAdaper();
                }
            } else {
                T.showShort(getApplicationContext(), getResources().getString(R.string.no_data));
            }
            L.i(TAG, response);
        }
    }

|-- 3.5如果您覺得可以用到了自己的項目中,可以對代碼的健壯性補充補充 ,對Volley封裝了一下,是不是很簡單,(*^__^*) 嘻嘻…… 假如你的項目需要頻繁的訪問網絡,可以試試哈,我覺得還蠻好用的,這兩個Jar包我就不放了 ^_^

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved