解决viewpager嵌套下的oom

最近在做一个项目,需要用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();
		}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值