Volley清除缓存和java.io.InterruptedIOException异常

      转载请注明出处:ttp://blog.csdn.net/moushao/article/details/53673140

      在安卓app开发中,很多童鞋都会用Volley网络请求框架,这次app的欢迎界面和登录界面都是我负责开发编码的,所以我遇到了两个特坑爹的问题!两个bug都超级简单,第一个多写了一句代码,第二个少写了一句代码而已·····我着重说说第一个!

    

     第一个:当前接口返回来的数据是上一个调成功的接口的数据

     这个bug隐藏的比较深,以至于到头天交付测试组的时候才被发现。 在登录时候,我首先会调A接口进行时间比对,如果后台返回的时间和我本地的时间在允许的误差范围内,我则调用B接口进行登录。如果这是安装运行后首次登录,没问题!如果第二次登录,没问题!第N次登录,还是没问题!只有一种情况下会出现这个问题,那就是,当我之前已经登陆成功过了,我从切换账号的方式(不是从欢迎界面,也没后台杀死app)重新回到登录界面,点击登录先请求A接口数据进行时间比对,如果时间没有误差,时间是对的,则没什么问题,能登录成功。如果时间有误差,我会跳转到时间的设置界面,重新设置事件后返回到登录界面,再次点击登录请求A的时候,它却返回的是我最开始登录成功B的数据·····

     Volley的框架是队列,队列遵循先进先出的原则,如果返回的是上一个调用的接口数据,则说明串口了。最开始我在Activity的OnDestory()中执行了:

     RequestQueue.cancelAll(tag);

    在Activity销毁的时候取消在被销毁Activity中请求过的接口请求。之前的app开发中,我也是这么做的,但这次发现,并没有什么卵用!!!最坑爹的是,一旦出现了这个bug,后台结束程序重启,第一个接口请求的数据依然是杀死app之前最后一次请求成功的数据!!!!这让我分析的方向抖错了,我一直以为是Tag和上下文依赖的问题,在这个问题上改来改去搞了一整天,一无所获!问题是重现这个bug的步骤还他妈比较麻烦,所以,坑死爹爹了!!!

    后来我想到了缓存,如果不是tag和上下文依赖的问题,那只有一种情况了:缓存

    然而,百度了2小时,众说纷纭,越看越迷惑(可能是我的能力问题)。中午吃完饭。坐在电脑前,一步一步的走源码,当我看到Cache的时候,眼镜都亮了!进一步看,发现RequestQueue清楚缓存的方法:

    RequestQueue.getCache().clear();

    我无比激动的在请求框架中添加了这句代码,大功告成!想哭的感觉都有了!!!


    第二个:全app的第一个接口,老是报: java.io.InterruptedIOException

    末了,第一个问题。百度了一下发现是因为我在请求数据时候,调用了RequestQueue.star()方法,跟着源码走进去,发现原来在Volley框架中,初始化RequestQueue的时候,已经执行了Star()方法,所以,当我再次star的时候,会报出:java.io.InterruptedIOException

     点击RequestQueue.star()方法进去:

Volley清除缓存和java.io.InterruptedIOException异常_第1张图片

    首先执行的是stop()方法,

Volley清除缓存和java.io.InterruptedIOException异常_第2张图片

    点击stop()进去,

Volley清除缓存和java.io.InterruptedIOException异常_第3张图片

     执行了quit()方法:

Volley清除缓存和java.io.InterruptedIOException异常_第4张图片

诶,有个interrupt()方法!感觉差不多了!再点击进去!

Volley清除缓存和java.io.InterruptedIOException异常_第5张图片

看注释,ok了!

所以,取消RequestQueue.star()就行。

到此,解决完毕!

尊重知识,多看源码!

你可能感兴趣的:(技术博客)