两个问题:
1、如果图片达到500kb每张,你这个划屏会有顿卡;
2、快速滑动有出现0.几秒的白屏。图片越大,顿卡越明显。

回复parcool:500kb的背景算大的了,如果是想做图片墙,viewpager不适合,可以使用开源的图片墙工具,内存+硬盘缓存

还有哦,你这个图片根本没有手动回收,依然会OOM!

今天在制作应用某个功能的引导页时,使用了ViewPager进行页面切换,每个页面就放了一个ImageView,使用背景图来进行展示,由于多图(11张)的原因,导致了OOM问题,这里总结一下。

代码如下:

  1. public class GuideActivity extends Activity implements OnPageChangeListener{
  2. private ViewPager viewPager;
  3. private GuideAdapter adapter;
  4. private LinearLayout dotContain;
  5. private Button btnSure;
  6. private List<View> mViews=new ArrayList<View>();
  7. private int[] mResIds=new int[]{
  8. R.drawable.step01,
  9. R.drawable.step02,
  10. R.drawable.step03,
  11. R.drawable.step04,
  12. R.drawable.step05,
  13. R.drawable.step06,
  14. R.drawable.step07,
  15. R.drawable.step08,
  16. R.drawable.step09,
  17. R.drawable.step10,
  18. R.drawable.step11
  19. };
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. requestWindowFeature(Window.FEATURE_NO_TITLE);
  24. setContentView(R.layout.activity_guide);
  25. initViews();
  26. initDatas();
  27. }
  28. protected void initViews() {
  29. viewPager=(ViewPager) findViewById(R.id.vp_guide);
  30. dotContain=(LinearLayout) findViewById(R.id.layout_dot_contain);
  31. btnSure=(Button) findViewById(R.id.btn_sure);
  32. adapter=new GuideAdapter(mViews);
  33. }
  34. protected void initDatas() {
  35. for (int i = 0; i < mResIds.length; i++) {
  36. ImageView img=new ImageView(this);
  37. //延迟设置图片,在PagerAdapter内设置,解决OOM问题
  38. /*ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
  39. ViewGroup.LayoutParams.MATCH_PARENT,
  40. ViewGroup.LayoutParams.MATCH_PARENT);
  41. img.setBackgroundResource(mResIds[i]);
  42. img.setLayoutParams(params);*/
  43. mViews.add(img);
  44. }
  45. viewPager.setAdapter(adapter);
  46. viewPager.setOnPageChangeListener(this);
  47. viewPager.setCurrentItem(0);
  48. viewPager.setOffscreenPageLimit(1);
  49. dotContain.getChildAt(0).setSelected(true);
  50. }
  51. /**
  52. *
  53. * 2014-12-19 上午10:56:19
  54. * @param position
  55. * @TODO 改变底部图标状态
  56. */
  57. private void chageDotState(final int position){
  58. int count=dotContain.getChildCount();
  59. for (int i = 0; i < count; i++) {
  60. View view=dotContain.getChildAt(i);
  61. if(position%count==i){
  62. view.setSelected(true);
  63. }else{
  64. view.setSelected(false);
  65. }
  66. }
  67. }
  68. /**
  69. *
  70. * @Create_date 2014-12-19 上午11:09:48
  71. * @TODO 适配器
  72. */
  73. class GuideAdapter extends PagerAdapter{
  74. private List<View> views;
  75. public GuideAdapter(List<View> views) {
  76. this.views = views;
  77. }
  78. @Override
  79. public int getCount() {
  80. return views.size();
  81. }
  82. @Override
  83. public boolean isViewFromObject(View arg0, Object arg1) {
  84. return arg0==arg1;
  85. }
  86. @Override
  87. public void destroyItem(ViewGroup container, int position, Object object) {
  88. container.removeView(views.get(position));
  89. }
  90. @Override
  91. public int getItemPosition(Object object) {
  92. return super.getItemPosition(object);
  93. }
  94. @Override
  95. public Object instantiateItem(ViewGroup container, int position) {
  96. //在此设置背景图片,提高加载速度,解决OOM问题
  97. View view=views.get(position);
  98. int count=getCount();
  99. ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
  100. ViewGroup.LayoutParams.MATCH_PARENT,
  101. ViewGroup.LayoutParams.MATCH_PARENT);
  102. view.setBackgroundResource(mResIds[position%count]);
  103. view.setLayoutParams(params);
  104. container.addView(view,0);
  105. return views.get(position);
  106. }
  107. }
  108. @Override
  109. public void onPageScrollStateChanged(int arg0) {
  110. }
  111. @Override
  112. public void onPageScrolled(int arg0, float arg1, int arg2) {
  113. }
  114. @Override
  115. public void onPageSelected(int arg0) {
  116. if(arg0<adapter.getCount()-1){
  117. dotContain.setVisibility(View.VISIBLE);
  118. btnSure.setVisibility(View.GONE);
  119. chageDotState(arg0);
  120. }else{
  121. dotContain.setVisibility(View.GONE);
  122. btnSure.setVisibility(View.VISIBLE);
  123. }
  124. }
  125. }

代码中已经进行了说明。一开始,使用了一个for循环,将所有的ImageView设置了背景并添加到List<View>中,这样导致,一点进这个界面时,有点卡顿,并且有时还会出现OOM问题。

解决办法就是:在for循环内只将ImageView对象添加到List<View>中,并不对其设置背景资源,将该步骤延迟到PagerAdapter$instantiateItem()中再进行设置。

说明:页面过多会报OOM的原因是,当ImageView在调用setBackgroundResource时,底层会调用BitmapFactory.decodeResource进行解码,而这个过程是耗时的,也很容易就OOM了,因此在for循环内进行多图设置的话就导致卡顿甚至OOM了。

viewPager--viewpager时,发生内存溢出OOM问题的更多相关文章

  1. 内存溢出(Oom)和内存泄露(Memory leak)

    1.概念 内存溢出(Oom):1.内存不够用:2.数据长度短的数据类型存储了一个数据长度较大的数据类型:3.一个结果 内存泄露(Memory leak):1.忘记释放已用内存,内存管理较为常见的现象: ...

  2. JVM:内存溢出OOM

    JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...

  3. 内存溢出(OOM)分析

    当JVM内存不足时,会抛出java.lang.OutOfMemoryError.   主要的OOM类型右: Java heap space:堆空间不足 GC overhead limit exceed ...

  4. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  5. 将 expression 转换为数据类型 int 时发生算术溢出

    将 expression 转换为数据类型 int 时发生算术溢出错误 2种快速处理方法 1.CONVERT(bigint, 字段名): 2.Cast(字段名 as decimal(18,2)): 这个 ...

  6. 将expression转化为数据类型int时发生算术溢出错误

    在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...

  7. 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

    解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如上图所示:频繁出现此 ...

  8. 内存溢出OOM与内存泄漏ML

    附, 微信团队原创分享:Android内存泄漏监控和优化技巧总结 一.如何避免OOM 异常 想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常. 1.图片过大导致OOM Android 中 ...

  9. java常见内存溢出(OOM)

    jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型, ...

随机推荐

  1. Javascript 事件对象(六)键盘事件

    keyCode获取用户按下键盘的哪个按键 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conte ...

  2. win7右键在目录当前打开命令cmd窗口

    一般打开方式Windows+R 打开运行窗口输入CMD 在当前目录下打开CMD 按住Shift键+点击鼠标右键,会出现一个选项“在此处打开命令窗口”在右键快捷方式里.

  3. Swift编程语言简介

    这篇文章简要介绍了苹果于WWDC 2014发布的编程语言Swift.                                                                   ...

  4. PARSEC-3.0编译错误

    OS: Ubuntu 14.04 LTS (x86_64) ***error 1 OpenSSL 1.0.1e 与 perl5.18 不兼容 POD document had syntax error ...

  5. C# 调用百度翻译Api

    这是简单的界面.用的是wpf,winform也可以 具体的操作类 public partial class MainWindow : Window { string url = "" ...

  6. Surprise团队项目总结

    Surprise团队项目总结 项目实现情况 实现人人模式:2个用户在同一台电脑上进行切磋下棋,即实现五子棋游戏的基本功能 实现人机模式:初级模式已经实现,可以进行人机交互,但是还没达到智能判断下棋点 ...

  7. gulp使用

    卸载插件:npm uninstall <name> [--save-dev]使用npm更新插件:npm update <name> [--save-dev]更新全部插件:npm ...

  8. C语言中内存的申请函数

    C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...

  9. 如何在Jenkins CI 里调试

    背景 厂内的CI系统把 Jenkins 和Github 连接了起来,这样Dev 只要通过github pr 就能够了解到测试job 运行的情况.有的时候,Dev会找到QA问,如何在Jenkins CI ...

  10. 解决java使用https协议请求出现证书不信任问题(PKIX path building failed)

    解决https请求时出现pkix path building fail错误 方法 将submail.cer 安全证书导入到java中的cacerts证书库 (sumail是我从https://api. ...