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就好了!