網絡通信框架Volley.它的設計目標是進行數據量不大,但通信頻繁的網絡操作,而對於大數據量的網絡操作,比如下載文件等,Volley的表現就不盡如人意。
在app開發中,我們最常見的就是從app客戶端向服務端發一個http請求.對於兩種基本的web請求方式get和post來說,get請求方式相對比較簡單,在此略過不表.本文重點描述一下通過volley進行幾種post提交的方式.
1.客戶端以普通的post方式進行提交,服務端返回字符串
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = newStringRequest(Request.Method.POST,httpurl,
newResponse.Listener<string>() {
@Override
publicvoid onResponse(String response) {
Log.d(TAG,"response -> " + response);
}
},newResponse.ErrorListener() {
@Override
publicvoid onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage(), error);
}
}) {
@Override
protectedMap<string, string=""> getParams() {
//在這裏設置需要post的參數
Map<string, string=""> map = newHashMap<string, string="">();
map.put("name1","value1");
map.put("name2","value2");
returnparams;
}
};
requestQueue.add(stringRequest);
2.客戶端以json串的post請求方式進行提交,服務端返回json串
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
publicvoid onResponse(JSONObject response) {
Log.d(TAG,"response -> " + response.toString());
}
},newResponse.ErrorListener() {
@Override
publicvoid onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage(), error);
}
})
{
//注意此處override的getParams()方法,在此處設置post需要提交的參數根本不起作用
//必須象上面那樣,構成JSONObject當做實參傳入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);
3.客戶端以普通的post方式進行提交,服務端返回json串
首先要繼承Request實現一個NormalPostRequest類,
private class NormalPostRequest extends Request<jsonobject> {
private Map<string, string=""> mMap;
private Listener<jsonobject> mListener;
public NormalPostRequest(String url, Listener<jsonobject> listener,ErrorListener errorListener, Map<string, string=""> map) {
super(Request.Method.POST, url, errorListener);
mListener = listener;
mMap = map;
}
//mMap是已經按照前面的方式,設置了參數的實例
@Override
protected Map<string, string=""> getParams() throws AuthFailureError {
return mMap;
}
//此處因爲response返回值需要json數據,和JsonObjectRequest類一樣即可
@Override
protected Response<jsonobject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
mListener.onResponse(response);
}
}
接下來的調用方式和前面差不多,生成一個Request實例,加入隊列中即可
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
Request<jsonobject> request = new NormalPostRequest(httpurl,
new Response.Listener<jsonobject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, "response -> " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage(), error);
}
}, params);
requestQueue.add(request);