两个问题:
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. Win10/UWP开发—使用Cortana语音指令与App的前台交互

    Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...

  2. WebMidiLink

    g200kg > WebMidiLink > 1.Introduction WebMidiLink 2012/06/26 1.Introduction « Prev 1.Introduct ...

  3. phpMyAdmin上传文件大小限制

    今日偶然要导一张数据表至mysql数据库中,但发现文件为2.9M,导入失败. 看一下返回的错误原因为文件超过2M的大小限制,郁闷. 找了一下“越狱”的方法,需要修改php.ini和phpmyadmin ...

  4. Course Schedule II

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  5. CEPH经常出现slow request的排查解决

    现象: 通过ceph -w日志经常发现有request blocked的问题(如果虚拟机系统跑在ceph上时,就会发现严重的卡顿现象) 排查: 1.通过dstat未发现有明显的瓶颈 (dstat -t ...

  6. EMV文档:接收到的ATR不在EMV规定范围,终端需要的操作

    Required terminal behaviour in the event that a terminal receives characters outside the range allow ...

  7. EntityFramework 优化

    1.分页的时候,尽量在数据库里面去分页. //在数据库中分页 ).Take().ToList(); //先把数据从数据库中查出来,然后才分页 ).Take(); 2.尽量禁用延迟加载,尽量使用预加载和 ...

  8. Flex box弹性布局 及 响应式前端设计的优化

    Flex box弹性布局 Flex box是CSS3新添加的一种模型属性,它的出现有力的打破了我们常常使用的浮动布局.实现垂直等高.水平均分.按比例划分,可以实现许多我们之前做不到的自适应布局.如果你 ...

  9. iOS9 URL Schema 白名单 微信

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 受此影响,当你的应用在 ...

  10. 计算ffff:0~ffff:b数据的和,结果存在dx中

    代码: assume cs:sad sad segment start: mov ax, 0ffffh mov ds, ax mov dx, ; add ds:0bh~ds:1h mov cx, 0b ...