編輯:關於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 MapgetParams() 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; } publicvoid 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存儲。分享給大家供大家參考,具體如下:1、SharedPreferences存儲在前面一篇文章《
在Android 5.0 中引入了Material Design的設計理念,並加入了RecyclerView和CardView兩個控件。本文就講解如何使用者兩個控件來實現
一、非法字符: '?'在將項目導入到Studio時提示 錯誤:非法字符: '?',編譯器沒報錯但編譯出錯,比較頭疼,後來發現原
spinner組件有點類型於HTML中的下拉框<Select></select>的樣子,讓用戶每次從下拉框中選取一個,本文為大家分享了Androi