使用ViewPager时,发生内存溢出OOM问题
来源:互联网 发布:东莞买房 知乎 编辑:程序博客网 时间:2024/06/03 18:51
今天在制作应用某个功能的引导页时,使用了ViewPager进行页面切换,每个页面就放了一个ImageView,使用背景图来进行展示,由于多图(11张)的原因,导致了OOM问题,这里总结一下。
代码如下:
public class GuideActivity extends Activity implements OnPageChangeListener{private ViewPager viewPager;private GuideAdapter adapter;private LinearLayout dotContain;private Button btnSure;private List<View> mViews=new ArrayList<View>();private int[] mResIds=new int[]{R.drawable.step01,R.drawable.step02,R.drawable.step03,R.drawable.step04,R.drawable.step05,R.drawable.step06,R.drawable.step07,R.drawable.step08,R.drawable.step09,R.drawable.step10,R.drawable.step11}; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_guide);initViews();initDatas();}protected void initViews() {viewPager=(ViewPager) findViewById(R.id.vp_guide);dotContain=(LinearLayout) findViewById(R.id.layout_dot_contain);btnSure=(Button) findViewById(R.id.btn_sure);adapter=new GuideAdapter(mViews);}protected void initDatas() {for (int i = 0; i < mResIds.length; i++) {ImageView img=new ImageView(this);//延迟设置图片,在PagerAdapter内设置,解决OOM问题/*ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);img.setBackgroundResource(mResIds[i]);img.setLayoutParams(params);*/mViews.add(img);}viewPager.setAdapter(adapter);viewPager.setOnPageChangeListener(this);viewPager.setCurrentItem(0);viewPager.setOffscreenPageLimit(1);dotContain.getChildAt(0).setSelected(true);}/** * * 2014-12-19 上午10:56:19 * @param position * @TODO 改变底部图标状态 */private void chageDotState(final int position){int count=dotContain.getChildCount();for (int i = 0; i < count; i++) {View view=dotContain.getChildAt(i);if(position%count==i){view.setSelected(true);}else{view.setSelected(false);}}}/** * * @Create_date 2014-12-19 上午11:09:48 * @TODO 适配器 */class GuideAdapter extends PagerAdapter{private List<View> views;public GuideAdapter(List<View> views) {this.views = views;}@Overridepublic int getCount() {return views.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0==arg1;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(views.get(position));}@Overridepublic int getItemPosition(Object object) {return super.getItemPosition(object);}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//在此设置背景图片,提高加载速度,解决OOM问题View view=views.get(position);int count=getCount();ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);view.setBackgroundResource(mResIds[position%count]);view.setLayoutParams(params);container.addView(view,0);return views.get(position);}}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {if(arg0<adapter.getCount()-1){dotContain.setVisibility(View.VISIBLE);btnSure.setVisibility(View.GONE);chageDotState(arg0);}else{dotContain.setVisibility(View.GONE);btnSure.setVisibility(View.VISIBLE);}}}
代码中已经进行了说明。一开始,使用了一个for循环,将所有的ImageView设置了背景并添加到List<View>中,这样导致,一点进这个界面时,有点卡顿,并且有时还会出现OOM问题。
解决办法就是:在for循环内只将ImageView对象添加到List<View>中,并不对其设置背景资源,将该步骤延迟到PagerAdapter$instantiateItem()中再进行设置。
说明:页面过多会报OOM的原因是,当ImageView在调用setBackgroundResource时,底层会调用BitmapFactory.decodeResource进行解码,而这个过程是耗时的,也很容易就OOM了,因此在for循环内进行多图设置的话就导致卡顿甚至OOM了。
0 0
- 使用ViewPager时,发生内存溢出OOM问题
- Android使用bitmap导致内存溢出(oom)问题
- 关于ViewPager加载多个导致OOM内存溢出的问题。
- ViewPager或ImgeView加载图片出现内存溢出(OOM)
- 使用Bitmap--避免OOM内存溢出
- Android内存溢出(OOM)
- OOM java内存溢出
- imageloader 内存溢出OOM
- 14.OOM内存溢出
- 解决oom(内存溢出)
- oom内存溢出解决方案
- android OOM 内存溢出
- 解决ViewPager 内存溢出的问题
- 如何解决加载大图片时内存溢出的问题 OOM
- 如何避免图像加载OOM 内存溢出 的问题
- 学习笔记之——内存溢出OOM问题
- 安卓程序oom(内存溢出)的问题
- Android 内存溢出(OOM)问题分析方法
- Java基础_super()用法和继承的关系
- 动态修改控件高度
- 黑马程序员——OC学习之类的声明和实现
- linux下的tomcat内存溢出问题解决
- 自动更新组件分享
- 使用ViewPager时,发生内存溢出OOM问题
- hibernate单向关联和双向关联的区别
- DB2 索引整理
- 字典NSDictionary
- [C++]LeetCode: 48 Binary Tree Inorder Traversal
- 在Maven仓库中添加Oracle JDBC驱动
- TD-SCDMA单载频小区信道容量计算(一)
- mybatis里面批量删除的使用方法:
- C/C++宏定义的可变参数