解决viewpager嵌套下的oom

来源:互联网 发布:上海数据恢复中心 编辑:程序博客网 时间:2024/05/29 11:46
最近在做一个项目,需要用radiogroup做指示器切换viewpager,同时在第一个viewpager中嵌套一个viewpager的购物项目,如图:

一开始做的很顺利,但是最后在频繁切换tab时发现问题,会出现oom,
在频繁切换tab时,通过
long maxMemory = Runtime.getRuntime().maxMemory();long freeMemory = Runtime.getRuntime().freeMemory();long totalMemory = Runtime.getRuntime().totalMemory();

发现totalMemory的值逐渐逐渐增长,逼近线程的vm heap的16M最大值,最后导致oom;


然后一点一点的打桩才找到问题原因:
原来是,因为的布局结构嵌套的比较深,在切换tab是要频繁调相应pager 对象中的initData 方法,而该方法中的因为又有viewpager,又需要填充view对象和利用findViewbyid找控件,不断的切换tab就是不断地新建view对象,逐步在增加totalMemory,最后oom.


解决办法:

借鉴了listView的convertView 的操作方法,构建静态变量用来存放填充后的view 对象和findviewbyid找到的控件对象,

public static View menuConvertView;private static IndexMenuViewPagerHolder menuHolder;public static IndexMenuViewPagerHolder getMenuHolder() {return menuHolder;}public static void setMenuHolder(IndexMenuViewPagerHolder menuHolder) {HolderUtils.menuHolder = menuHolder;}////////////////////////////////////////获取TemplatePager的holder///////////////////////////public static View templateConvertView;private static templateViewHolder templateHolder;public static templateViewHolder getTemplateHolder() {return templateHolder;}public static void setTemplateHolder(templateViewHolder templateHolder) {HolderUtils.templateHolder = templateHolder;}

这样在频繁切换时,不用再新建,而是直接到静态变量中取,,本身inflate和findviewbyid都是很耗费性能的,这样一来又提高了速度,完美解决了oom

if(HolderUtils.templateConvertView==null){HolderUtils.templateConvertView=View.inflate(mActivity, R.layout.homedetail_pager, null);holder = new templateViewHolder();holder.headersListView = (HeadersListView) HolderUtils.templateConvertView.findViewById(R.id.lv_homelistview);HolderUtils.setTemplateHolder(holder);}else{holder=HolderUtils.getTemplateHolder();}




原创粉丝点击