AsyncHttpClient如何进行Session的保存
在之前我从来没有通过AsyncHttp这个请求框架去保存Session,但是今天不得不用呀!接口设计有限,我也只好用专门给浏览器用的接口了,这次我把AsyncHttpClient封装成了一个单例,通过这样的方式来保存Session,暂时先这么用吧,等到找到其他解决方案了再更新此文!
一、封装
先封装一个专门处理Cookie的工具类:
1public class CookieUtils {
2
3 private static List<Cookie> cookies;
4
5 /* 返回cookies列表 */
6 public static List<Cookie> getCookies() {
7 return cookies != null ? cookies : new ArrayList<>();
8 }
9
10 /* 设置cookies列表 */
11 public static void setCookies(List<Cookie> cookies) {
12 CookieUtils.cookies = cookies;
13 }
14
15 /* 存储cookie */
16 public static void saveCookie(AsyncHttpClient client, Context context) {
17 PersistentCookieStore cookieStore = new PersistentCookieStore(context);
18 client.setCookieStore(cookieStore);
19 }
20
21 /* 得到cookie */
22 public static List<Cookie> getCookie(Context context) {
23 PersistentCookieStore cookieStore = new PersistentCookieStore(context);
24 List<Cookie> cookies = cookieStore.getCookies();
25 return cookies;
26 }
27
28 /* 清除cookie */
29 public static void clearCookie(Context context) {
30 PersistentCookieStore cookieStore = new PersistentCookieStore(context);
31 cookieStore.clear();
32 }
33}
再封装一下AsyncHttpClient,这样所有的AsyncHttpClient用的都是同一个对象了!
1public class FinalAsyncHttpClient {
2 private AsyncHttpClient client;
3 /* 构造方法 */
4 public FinalAsyncHttpClient() {
5 client = new AsyncHttpClient();//实例化client
6 client.setTimeout(5);//设置5秒超时
7 // 获取cookie列表
8 if (CookieUtils.getCookies() != null) {
9 BasicCookieStore bcs = new BasicCookieStore();
10 bcs.addCookies(CookieUtils.getCookies().toArray(
11 new Cookie[CookieUtils.getCookies().size()]));//得到cookie列表
12 client.setCookieStore(bcs);//给client加载cookie
13 }
14 }
15
16 /* 得到client对象方法 */
17 public AsyncHttpClient getAsyncHttpClient() {
18 return this.client;
19 }
20}
二、使用
获取对象并且设置保存Cookie
1AsyncHttpClient asyncHttpClient = new FinalAsyncHttpClient().getAsyncHttpClient();
2CookieUtils.saveCookie(asyncHttpClient,LoginAty.this);
登录成功
1asyncHttpClient.post(AppConfig.loginAddress, params,
2 new AsyncHttpResponseHandler() {
3 @Override
4 public void onSuccess(int statusCode, Header[] headers,
5 byte[] responseBody) {
6 //....
7 XToast.success(getContext(), "登录成功").show();
8 CookieUtils.setCookies(CookieUtils.getCookie(LoginAty.this));
9 //....
10 }
三、拓展
但是这样也有问题,每次开启App的时候cookie就消失了,我们把cookie通过序列化的方式存起来就好了,如果发现cookie过期,现在有更好的解决方式,直接在App开启的时候就更新一次cookie就好了!