使用ViewPage过程中遇到的OOM及EX

来源:互联网 发布:mac 怎么用f5 编辑:程序博客网 时间:2024/06/05 01:27
OOM
情景:需要在一个Fragment中使用autobanner轮播图 和一个静态viewPager  同时两者都有联动Indicator
考虑结构类似决定复用同一个bannerFragment;
然后就悲剧了;连续花了两个晚上折腾到2点都没有调试清楚;
直到真正空下来认真研究调试;
<-------------------------------以上唠叨,以下正文-------------------------------------->
来围观第一个Bug

情景:1.进入就死;2.多次启动程序加载完图片或者使用静态图填充后,静态banner滑动;
下面这个错误的原因 :
是在  同一个Fragment 中复用同一个bannenrFragment   viewpager  中pager  ID一样
系统无法识别。类似递归,导致OOM

解决:复用代码bannerFragment  但是需要  cpuyi个相同的bannerFragment  xml文件  并且  pager的ID 需要重新注册;然后在
bannerFragment中根据需要复用;
另:不同的viewPager需要不同的fm;

解决了这个Bug,但是别开心太早还有 问题 依旧是OOM  (暂时不太清楚原因,后来清楚了)
补充:savestate  触发机制 是在图片加载过程中  关闭或暂停Activity调用
destoryitem()     触发机制是在图片加载完成之后  关闭activity触发

解决bug思路: 重写fragmentStatePagerAdapter  中 instantiateItem()、destroyItem()、saveState()、restoreState()方法

下面这个错误 是因为commit的执行是在Activity 销毁前 onsaveInstanceState之后进行操作的,此时用commit提交可能
导致因State丢失而导致异常,解决方法是commitAllowStateLoss()
官方文档:
允许在状态丢失的情况下提交

触发情景  当Fragment正在加载图片   back退出app  


onResponse中调用replace()但是此时Activity已经Ondestory();
解决思路: 1.异步任务重调用片段方法前,判断Activity是否存在,2.重写Ondestory();当destory触发则停止所有异步任务;
<-------------------------------以上正文,以下唠叨-------------------------------------->
终于有一种便秘365天之后一泻千里的畅快了。
性格比较倔强,虽然重心是开发,但是还是想克服难题;但是值得注意的是,在工作中尽量不要这么
较真,先实现功能为主,闲暇之时可以来研究;迂回,规避都可以;

感触:
遇到Bug不要怕,无非两种情况,一,别人能处理,你暂时不能处理,最后你能处理,二、Google从来都没想过
一个coder要这么用代码,您珍重吧----绕行。
在解决一些陌生的Bug时,一开始是很痛苦的但是等真的解决掉,居然特么的上瘾了我了个xxx,我要打十个!
所以如果是解决bug的时候,首先是要能静下心自己分析代码逻辑,反复打日志,反复让程序炸;
反复看代码,查文档,问度娘;并且收集ex、error记录比对;逐一击破;然后你就上瘾了;

最后,以上情景适用个例,如有雷同请慎用。
同是天涯代码狗,相逢何必曾相识;开心,所以决定分享这次经历;若其他有疑问,大家共同探讨;

0 0