Xutils3.0的cookie设置

来源:互联网 发布:手机加油软件代理 编辑:程序博客网 时间:2024/06/05 06:21

Xutils3.0的cookie设置

一.引言
最近学会分析了Android内存泄漏,兴致勃勃地把公司项目拿来做分析,一分析,吓一跳,到处都是内存泄漏!!仔细看了下,主要是自己用volley搭的网络请求框架有问题!!主要原因就是:网络请求的工具类是静态的,但是在Activity中向该工具类传递了一个Listener,这样导致了Activity泄漏。分析出了原因,要做修改感觉很困难,工作量很大。这时候就萌发了把自己写的框架替换掉的想法。在项目启动时候,考虑是否采用Xutils 3.0来做,当那时候,xUtils3.0 刚出来,网上看到很多bug,而且有个cookie问题,自己尝试了,也木有解决,所以当时就放弃了。这次又看了下,发现gitHub上对Cookie问题有专门的issue,所以就尝试来用。
二.曾经遇到的坑
以前用Xutils遇到的坑就是 :我们项目的后台对session失效会有一个返回报文,而当时版本的xutils自作主张的把这个给拦截了,这次使用,返现会在onSucc中返回这个报文,而且也有获取cookie的方式。于是,就在项目中把原有的Volley框架给替换了。
三.新的大坑
费了九牛二虎之力,总算把框架替换过来了,起初一切也如想象中一样,但接着遇到了一个更大的问题,当APP某个Activity崩溃之后,Cookie就丢失了,并且这个崩溃页面的网络请求并不是迅速出错(我们对Session失效的处理就是,返回登陆页面),而是在设置的超时时间之后,再在 onError方法中抛出异常:

java.net.ProtocolException: unexpected end of stream

这就恶心了,而且即使调到登陆页面,整个项目的体验也很不好。纠结呀!

四.解决方法
再Xutils3.0的Github上作者大神虽然提了解决方法,但是不知道为什么,他提的那个解决方式根本不行,原因就是 RequestInterceptListener 这个接口实现后,请求就报错!!这下纠结了,分析了很久,总算解决问题了:在登陆接口的onSucc的方法中,将cookie保存在SharedPreferences,然后自定义RequestParams。
五.代码
保存Cookie

 NetParams requestParams = new NetParams( Constant.NET_Login_Goods,params,0);  x.http().post(requestParams, new NetCallBack() {   @Override  public void onSuccess(org.json.JSONObject result) {   try {                                    L.d("NET_Login_Goods:"+result.toString()); DbCookieStore instance = DbCookieStore.INSTANCE;  List<HttpCookie> cookies = instance.getCookies();                                    for (HttpCookie cookie:cookies){   String name =   cookie.getName();  String value =   cookie.getValue();                                        if("JSESSIONID".equals(name)){     myCookie =value;     SharedPreferences.Editor editor = context.getSharedPreferences(Constant.SP_NAME, context.MODE_PRIVATE).edit();        editor.putString("Cookie", myCookie);        editor.commit();        NetConstant.Cookie = myCookie;     break;      }   }}}

自定义RequetParams

public class NetParams extends RequestParams {    public NetParams(String url, JSONObject params, int timeOut){        super(Constant.EURL+url);        setConnectTimeout(timeOut==0?30*1000:timeOut);        if(params!=null)            setBodyContent(params.toString());        )//登陆接口 和不需要CooKie的接口        if (!"/auth/getDate".equals(url)&&!"/api/auth".equals(url)) {            SharedPreferences sharedPreferences = x.app().getSharedPreferences(Constant.SP_NAME, Context.MODE_PRIVATE);NetConstant.Cookie = sharedPreferences.getString("Cookie", ""); addHeader("Cookie", "JSESSIONID="+NetConstant.Cookie);   setUseCookie(false);              addHeader("Content-Type", "application/json;charset=UTF-8");        }else{            setUseCookie(true);        }    }}

这样就完美的解决了Xutils3.0的Cookie问题了。

1 0