Xutils3.0的cookie设置

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 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问题了。

你可能感兴趣的:(Xutils3-0,cookie,android,Android)