編輯:關於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);
}
}
@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);
}
@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包我就不放了 ^_^
Android持久化技術之SharedPreferences存儲實例詳解
本文實例講述了Android持久化技術之SharedPreferences存儲。分享給大家供大家參考,具體如下:1、SharedPreferences存儲在前面一篇文章《
Android中使用RecyclerView和CardView實現瀑布流效果(StaggeredGrid)
在Android 5.0 中引入了Material Design的設計理念,並加入了RecyclerView和CardView兩個控件。本文就講解如何使用者兩個控件來實現
Android Studio 錯誤: 非法字符: '\ufeff' 及 Gradle不能自動查找xml自定義屬性
一、非法字符: '?'在將項目導入到Studio時提示 錯誤:非法字符: '?',編譯器沒報錯但編譯出錯,比較頭疼,後來發現原
Android下拉列表spinner的實例代碼
spinner組件有點類型於HTML中的下拉框<Select></select>的樣子,讓用戶每次從下拉框中選取一個,本文為大家分享了Androi