前言:html
最近在將本身寫的爛代碼重構,之前使用的網絡請求全是基於apache的HttpClient,簡單使用還好,使用多了發現重複代碼太多,並且每次使用都很繁瑣,所以在網上找了半天網絡請求的相關類庫,最後仍是肯定使用Volley,因而如今記個使用筆記:java
Volley幾個主要功能:android
1. 普通String請求:git
既然使用了網絡請求,那麼網絡權限是必不可少的,在AndroidManifest.xml中添加:github
<uses-permission android:name="android.permission.INTERNET" />
由於網絡請求有GET/POST兩種,這裏須要注意一下,調用Volley進行POST的時候提供的是getParams方法來存入鍵值對,因此這裏使用了String... strKV來代替HashMap;apache
代碼以下:網絡
package com.dreamyfly.volleyexample.utils; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import java.util.HashMap; import java.util.Map; public class HttpUtils { /** * 使用方法: * 1. 在相應的Activity中實現RequestQueue的實例化 * 2. 實現對應的AsyncRequestable和Executable接口 * 3. 填入get或者post的url,最後請求結果會返回在Executable的方法中 * 4. 傳入的參數以String... strKVs格式傳入,例: 「email」, "xxx@qq.com", "password", "123456" * 因此4中最後傳入參數實際格式會變爲: email=xxx@qq.com&password=123456 */ public static void doVolleyGet(AsyncRequestable qa, String getUrl, final Executable<String> execOnSuccess, final Executable<VolleyError> execOnError, final String... strKVs) { doVolleyRequest(Request.Method.GET, qa, getUrl, execOnSuccess, execOnError, strKVs); } public static void doVolleyPost(AsyncRequestable qa, String postUrl, final Executable<String> execOnSuccess, final Executable<VolleyError> execOnError, final String... strKVs) { doVolleyRequest(Request.Method.POST, qa, postUrl, execOnSuccess, execOnError, strKVs); }
private static void doVolleyRequest(int requestMethod, AsyncRequestable qa, String requestUrl, final Executable<String> execOnSuccess, final Executable<VolleyError> execOnError, final String... strKVs) { StringRequest requestPost = new StringRequest(requestMethod, requestUrl, new Response.Listener<String>() { @Override public void onResponse(String resultStr) { if (execOnSuccess != null) execOnSuccess.execute(resultStr); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { if (execOnError != null) execOnError.execute(volleyError); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> map = new HashMap<String, String>(); if (strKVs != null && (strKVs.length % 2 == 0)) { for (int i = 0; i < strKVs.length; i += 2) { map.put(strKVs[i], strKVs[i + 1]); } } return map; } }; // queueTag 用於調用cancelAll(queueTag)取消加入隊列的請求 requestPost.setTag(qa.getQueueTag()); qa.getQueue().add(requestPost); } }
使用GET請求方式以下:ide
// 調用doVolleyGet實現GET請求 HttpUtils.doVolleyGet(new AsyncRequestable() { @Override public String getQueueTag() { return null; } @Override public RequestQueue getQueue() { // 在此return mQueue以確保mQueue可以加入RequestQueue中 return mQueue; } }, METHOD_GET_URL, new Executable<String>() { @Override public void execute(String resultStr) { // GET請求以String類型在此傳出,而且能夠實現UI操做,例如Toast Toast.makeText(MainActivity.this, "GET Result: " + resultStr, Toast.LENGTH_SHORT).show(); requestResultTV.setText(String.valueOf(resultStr)); } }, new Executable<VolleyError>() { @Override public void execute(VolleyError volleyError) { // 若是訪問失敗,則打印Log Log.e("VolleyError", volleyError.toString()); } }); // StrKVs什麼也不傳的話參數就爲null
請求結果如圖:post
2. Json請求:this
JSON請求的JSON接口我當前使用的是國家氣象局的接口:http://www.weather.com.cn/adat/sk/101010100.html (網上隨便找的,能用就行),以下圖:
{
weatherinfo: {
city: "北京", cityid: "101010100", temp: "10", WD: "東南風", WS: "2級", SD: "26%", WSE: "2", time: "10:25", isRadar: "1", Radar: "JC_RADAR_AZ9010_JB", njd: "暫無實況", qy: "1012" } }
3. NetworkImageView加載Image:
相關資源:
1. 大神解析:guolin
2. 源碼:
Github:https://github.com/eterrao/android-volley.git
google:https://android.googlesource.com/platform/frameworks/volley
CSDN下載jar包:
明天繼續補充,今天先到這兒吧