转载请注明地址:http://www.jianshu.com/users/2ab0374f3ba2/latest_articles
本人小菜鸟一只,最近因为新项目不能用原来的asynchttpclient 网络请求框架,怒换框架(其实是被逼的),Session干什么的自己去百度- - 我也说不明白。
先来简单介绍一下Volley吧 :Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
首先需要下载Volley
官方地址:
git clone https://android.googlesource.com/platform/frameworks/volley
android studio Gradle 镜像
compile'com.mcxiaoke.volley:library:1.0.19'
对于一般的使用我就不说明了。大伙去看其他的博客吧,这里我就说一下我自己是怎么使用session在保持连接状态的。
*/***
* Created by pokermman on 16/5/31.
*/
public class CookiePostRequest extends Request<JSONObject> {
private Map<String, String> mMap;
private Response.Listener<JSONObject> mListener;
private String mHeader;
private Map<String, String> sendHeader=new HashMap<String, String>(1);
public CookiePostRequest(String url, Map map, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener){
super(Method.POST, url, errorListener);
mListener = listener;
mMap = map;
}
//当http请求是post时,则需要该使用该函数设置往里面添加的键值对 @Override
protected Map<String, String> getParams() throws AuthFailureError {
return mMap;
}
@Override
protected Response<JSONObject>parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
//获取头部信息
mHeader = response.headers.toString();
Log.w("LOG","get headers in parseNetworkResponse "+response.headers.toString());
//获取cookie头部信息
Map<String, String> responseHeaders = response.headers;
String rawCookies = responseHeaders.get("Set-Cookie");
LogUtils.d(rawCookies);
//;分隔获取sessionid
String[] splitCookie = rawCookies.split(";");
//使用SharedPreferences本地存储
SharedPreferences sp = BnxApplication.getInstance().getSharedPreferences("CookiePrefsFile",0);
SharedPreferences.Editor prefsWriter = sp.edit();
prefsWriter.putString("cookie_",splitCookie[0]);
prefsWriter.commit();//
//将cookie字符串添加到jsonObject中,该jsonObject会被deliverResponse递交,调用请求时则能在onResponse中得到
JSONObject jsonObject = new JSONObject(jsonString);
// jsonObject.put("Cookie",rawCookies); //自行添加
Log.w("LOG","jsonObject "+ response.toString());
return Response.success(jsonObject, 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);
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return sendHeader;
}}
在我们使用session的时候必须在写一个Reques<T>类
因为在设置header的cookie之后就没办法在获取cookie这里会报错 获取的是null
Map<String, String> responseHeaders = response.headers;
String rawCookies = responseHeaders.get("Set-Cookie");
String[] splitCookie = rawCookies.split(";");
基本使用方法不变,我就不多写,只要在新的Reques<T>
重写getHeaders()方法
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
//获取存储的session值
PersistentCookieUtils CookieStore = new PersistentCookieUtils(BnxApplication.getInstance());
String localCookieStr = CookieStore.getCookies();
if (!localCookieStr.equals("")) {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", localCookieStr);//设置session
LogUtils.d("headers:" + headers);
return headers;
} else {
return super.getHeaders();
}
}
头一次写博客如果不足请大家提出,一起学习,进步。
PersistentCookieUtils 是自己写的本地数据存储方法大家自行解决哦。
转载请注明地址。