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

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  3. Android相机的使用
  4. Android(安卓)面向接口编程
  5. android升级ADT22没有R文件
  6. android adb 源码框架分析(1 系统)
  7. Android逆向之旅—Hook神器Cydia Substrate使用详解
  8. Android(安卓)Binder框架实现之Framework层服务注册过程源码分析
  9. Android(安卓)NDK开发及OpenCV初步学习笔记

随机推荐

  1. Mysql实现企业级日志管理、备份与恢复的
  2. 深入分析MySQL Sending data查询慢问题
  3. windows下重置mysql的root密码方法介绍
  4. Sql查询MySql数据库中的表名和描述表中字
  5. mysql5.7.14 解压版安装配置方法图文教程
  6. MySQL事务的基础学习以及心得分享
  7. 详解MySQL分组链接的使用技巧
  8. win10下完全卸载+重装MySQL步骤详解
  9. MySQL数据库Event定时执行任务详解
  10. MYSQL如何自动为查询数据的结果编上序号