| 首先簡單描述一下Google的Android開發(fā)團(tuán)隊在2013年推出的一個網(wǎng)絡(luò)通信框架Volley.它的設(shè)計目標(biāo)是進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作,而對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如下載文件等,Volley的表現(xiàn)就不盡如人意。
 在app開發(fā)中,我們最常見的就是從app客戶端向服務(wù)端發(fā)一個http請求.對于兩種基本的web請求方式get和post來說,get請求方式相對比較簡單,在此略過不表.本文重點描述一下通過volley進(jìn)行幾種post提交的方式.
 
 1.客戶端以普通的post方式進(jìn)行提交,服務(wù)端返回字符串
 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 StringRequest stringRequest = newStringRequest(Request.Method.POST,httpurl,
     newResponse.Listener<String>() {
         @Override
         publicvoidonResponse(String response) {
             Log.d(TAG, "response -> "+ response);
         }
     }, newResponse.ErrorListener() {
         @Override
         publicvoidonErrorResponse(VolleyError error) {
             Log.e(TAG, error.getMessage(), error);
         }
     }) {
     @Override
     protectedMap<String, String> getParams() {
         //在這里設(shè)置需要post的參數(shù)
               Map<String, String> map = newHashMap<String, String>();  
             map.put("name1", "value1");  
             map.put("name2", "value2");  
           returnparams;
     }
 };        
 requestQueue.add(stringRequest);
 | 
2.客戶端以json串的post請求方式進(jìn)行提交,服務(wù)端返回json串 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 Map<String, String> map = newHashMap<String, String>();  
 map.put("name1", "value1");  
 map.put("name2", "value2");  
 JSONObject jsonObject = newJSONObject(params);
 JsonRequest<JSONObject> jsonRequest = newJsonObjectRequest(Method.POST,httpurl, jsonObject,
     newResponse.Listener<JSONObject>() {
         @Override
         publicvoidonResponse(JSONObject response) {
             Log.d(TAG, "response -> "+ response.toString());
         }
     }, newResponse.ErrorListener() {
         @Override
         publicvoidonErrorResponse(VolleyError error) {
             Log.e(TAG, error.getMessage(), error);
     }
     })
     {
     //注意此處override的getParams()方法,在此處設(shè)置post需要提交的參數(shù)根本不起作用
     //必須象上面那樣,構(gòu)成JSONObject當(dāng)做實參傳入JsonObjectRequest對象里
     //所以這個方法在此處是不需要的
 //    @Override
 //    protected Map<String, String> getParams() {                
 //          Map<String, String> map = new HashMap<String, String>();  
 //            map.put("name1", "value1");  
 //            map.put("name2", "value2");  
                 
 //        return params;
 //    }
             
     @Override
     publicMap<String, String> getHeaders() {
         HashMap<String, String> headers = newHashMap<String, String>();
         headers.put("Accept", "application/json");
         headers.put("Content-Type", "application/json; charset=UTF-8");
                 
         returnheaders;
     }
 };
 requestQueue.add(jsonRequest);
 | 
看了上面這段代碼,會覺得volley這個框架實在是還不夠完善,使用JsonObjectRequest對象提交一個post請求,如果有參數(shù)需要提交,就必須以JSONObject的json串方式提交.如果服務(wù)端并不支持這種方式呢?比如常見的spring mvc服務(wù)端,就很難支持json的請求方式.
 那么我們想實現(xiàn)這個目標(biāo),就需要使用下面給出的辦法.
 
 3.客戶端以普通的post方式進(jìn)行提交,服務(wù)端返回json串
 首先在Activity類里,繼承Request實現(xiàn)一個NormalPostRequest類
 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | privateclassNormalPostRequest extendsRequest<JSONObject> {
     privateMap<String, String> mMap;
     privateListener<JSONObject> mListener;
     publicNormalPostRequest(String url, Listener<JSONObject> listener,ErrorListener errorListener, Map<String, String> map) {
         super(Request.Method.POST, url, errorListener);
             
         mListener = listener;
         mMap = map;
     }
     
     //mMap是已經(jīng)按照前面的方式,設(shè)置了參數(shù)的實例
     @Override
     protectedMap<String, String> getParams() throwsAuthFailureError {
         returnmMap;
     }
     
     //此處因為response返回值需要json數(shù)據(jù),和JsonObjectRequest類一樣即可
     @Override
     protectedResponse<JSONObject> parseNetworkResponse(NetworkResponse response) {
         try{
             String jsonString = newString(response.data,HttpHeaderParser.parseCharset(response.headers));
                 
             returnResponse.success(newJSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
         } catch(UnsupportedEncodingException e) {
             returnResponse.error(newParseError(e));
         } catch(JSONException je) {
             returnResponse.error(newParseError(je));
         }
     }
     @Override
     protectedvoiddeliverResponse(JSONObject response) {
         mListener.onResponse(response);
     }
 }
 | 
接下來的調(diào)用方式和前面差不多,生成一個Request實例,加入隊列中即可. | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 Request<JSONObject> request = newNormalPostRequest(httpurl,
     newResponse.Listener<JSONObject>() {
         @Override
         publicvoidonResponse(JSONObject response) {
             Log.d(TAG, "response -> "+ response.toString());
         }
     }, newResponse.ErrorListener() {
         @Override
         publicvoidonErrorResponse(VolleyError error) {
             Log.e(TAG, error.getMessage(), error);
         }
     }, params);
 requestQueue.add(request);
 | 
以上代碼在android 4.3環(huán)境下測試通過.
 |