只是想说,自己太懒了。太久没更新博客。今后有时间就要来总结下。
年初的时候,写过一篇博客,Android网络通信框架Volley初体验,这篇可真的是初体验。。。可以当作对volley初步认识,但是在实际应用中,却不实用。在本片博客中,我将对其进行补充,以达到volley可以在实际项目中应用。Demo在博客最下方。
本篇博客主要补充内容如下:
/**
* @return Volley 查询队列
*/
public RequestQueue getRequestQueue(String tag) {
if (mRequestQueue == null) {
Log.i("RequestQueue Initialize",
"mRequestQueue is Created by getRequestQueue() When "
+ tag);
DefaultHttpClient mDefaultHttpClient = new DefaultHttpClient();
HttpStack httpStack = new CustomHttpStack(mDefaultHttpClient);
mRequestQueue = Volley.newRequestQueue(mAppContext, httpStack);
}
return mRequestQueue;
}
CustomHttpStack部分代码:
/**
* 若该Request为CustomMultiPartStringRequest,则设置他的头文件信息Content-Type为multipart/
* form-data否则application/* x-www-form-urlencoded
*
* @param httpRequest
* @param request
* @throws AuthFailureError
*/
public static void setEntityIfNonEmptyBody(
HttpEntityEnclosingRequestBase httpRequest, Request> request)
throws AuthFailureError {
if (request instanceof IMultiPartRequest) {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(org.apache.http.entity.mime.HttpMultipartMode.BROWSER_COMPATIBLE);
Map fileUpload = ((IMultiPartRequest) request)
.getFileUploads();
for (Map.Entry entry : fileUpload.entrySet()) {
builder.addPart(((String) entry.getKey()), new FileBody(
(File) entry.getValue()));
}
ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE,
HTTP.UTF_8);
Map stringUpload = ((IMultiPartRequest) request)
.getStringUploads();
for (Map.Entry entry : stringUpload.entrySet()) {
try {
builder.addPart(((String) entry.getKey()),
new org.apache.http.entity.mime.content.StringBody(
(String) entry.getValue(), contentType));
} catch (Exception e) {
e.printStackTrace();
}
}
httpRequest.setEntity(builder.build());
} else {
byte[] body = request.getBody();
if (body != null) {
HttpEntity entity = new ByteArrayEntity(body);
httpRequest.setEntity(entity);
}
}
}
在上述代码中,由于使用自定义的HttpStack,使该RequestQueue支持普通数据以及文件上传。
/**
* @return Volley 查询队列
*/
public RequestQueue getRequestQueue(String tag) {
if (mRequestQueue == null) {
Log.i("RequestQueue Initialize",
"mRequestQueue is Created by getRequestQueue() When "
+ tag);
DefaultHttpClient mDefaultHttpClient = new DefaultHttpClient();
ClientConnectionManager mClientConnectionManager = mDefaultHttpClient
.getConnectionManager();
HttpParams mHttpParams = mDefaultHttpClient.getParams();
ThreadSafeClientConnManager mThreadSafeClientConnManager = new ThreadSafeClientConnManager(
mHttpParams, mClientConnectionManager.getSchemeRegistry());
mDefaultHttpClient = new DefaultHttpClient(
mThreadSafeClientConnManager, mHttpParams);
HttpStack httpStack = new CustomHttpStack(mDefaultHttpClient);
mRequestQueue = Volley.newRequestQueue(mAppContext, httpStack);
}
return mRequestQueue;
}
通过上述代码,即可完成RequestQueue的初始化。由于采用单例模式,避免了该死的oom。
/**
* 保存cookies
*
* @param headers
* Response Headers.
*/
public final void checkSessionCookie(Map headers) {
if (headers.containsKey(SET_COOKIE_KEY)
&& headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
String cookie = headers.get(SET_COOKIE_KEY);
if (cookie.length() > 0) {
// String[] splitCookie = cookie.split(";");
// String[] splitSessionId = splitCookie[0].split("=");
// cookie = splitSessionId[1];
Editor prefEditor = mSharePreferences.edit();
prefEditor.putString(SESSION_COOKIE, cookie);
prefEditor.commit();
}
}
}
/**
* 添加cookies
*
* @param headers
*/
public final void addSessionCookie(Map headers) {
String sessionId = mSharePreferences.getString(SESSION_COOKIE, "");
if (sessionId.length() > 0) {
// StringBuilder builder = new StringBuilder();
// builder.append(SESSION_COOKIE);
// builder.append("=");
// builder.append(sessionId);
// if (headers.containsKey(COOKIE_KEY)) {
// builder.append("; ");
// builder.append(headers.get(COOKIE_KEY));
// }
headers.put(SET_COOKIE_KEY, sessionId);
}
}
在自定义类中,调用方式为:
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
VolleyUtils.getInstance().checkSessionCookie(response.headers);
String str = null;
try {
str = new String(response.data, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Response.success(str,
HttpHeaderParser.parseCacheHeaders(response));
}
@Override
public Map getHeaders() throws AuthFailureError {
Map headers = super.getHeaders();
if (headers == null || headers.equals(Collections.emptyMap())) {
headers = new HashMap();
}
VolleyUtils.getInstance().addSessionCookie(headers);
return headers;
}
/**
* Get 请求,返回值格式为String
*
* @param mContext
* @param mTag
* @param url
* @param paramsForGet
* @param success
* @param error
*/
public static void getStringForGet(Context mContext, final String mTag,
String url, HashMap paramsForGet,
final Listener success, final ErrorListener error) {
try {
if (!isConnected(mContext)) {
Toast.makeText(mContext, "网络不可用,请检查网络连接!!~", Toast.LENGTH_LONG)
.show();
return;
}
String realUrl = NetworkUtil.getRequestUrl(url, paramsForGet);
CustomStringRequest sReq = new CustomStringRequest(Method.GET,
realUrl, new Listener() {
@Override
public void onResponse(String response) {
success.onResponse(response);
cancelRequest(mTag);
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) {
error.onErrorResponse(e);
cancelRequest(mTag);
}
});
getVolleyUtilsInstance().addToRequestQueue(sReq, mTag);
} catch (Exception e) {
e.printStackTrace();
}
}