关于ViewPager加载多个导致OOM内存溢出的问题。

时间:2021-09-11 20:56:37

其实,暂时还没有解决方案。本人比较是新手,工作4个月。。。



现在有这样一个需求:整个应用完全基于ViewPager的多页滑动(当然是指的多页滑动,不是特指ViewPager,ViewPager只是最容易想到的一个解决方案)。然后,每个页面有一个背景图片,这个背景图片并且最少压缩在400kb左右,再压缩效果不行了。

        我目前的解决方案:     

1、用ViewPager+Fragment实现滑动;

2、Fragment里onCreateView的时候Inflate一个layout,这个layout就一个背景图片。

遇到的问题:

之前滑动到12页都没问题,当滑动到13页的时候,报:inflate错误,具体错误等会儿来粘贴。意思就是内存溢出了。

照理说,ViewPager会自动回收已经滑过的页面(除了当前页、当前页上一页、当前页的下一页),我不知道是为什么会出现这样错误。

所以,当出现这个问题的时候,我在每个fragment里面的onDestory方法里回收了图片。但,问题依然存在。


这个小项目是由2个人开发,一个是ios那边的,我就当之无愧的出现这个问题了。但ios那边不会出现这个问题,且他也没有做特殊处理。我只想说:

IOS就是好!苹果大法就是好!

目前猜测可试一下的方案:

1、依然加载多个layout,但layout里不去设置background,在ViewPager的setOnPageChangeListener接口里设置上、当前、下一个fragment里的layout的background。然后销毁其他的图片(recycle)。

2、在1的基础上,把设置背景图片的代码搞到onCreateView里。



不知道行不行,下班了写一下了走人,回家看有时间验证一下没。顺便问个问题:ViewPager有没有这个属性----滑动多少停在多少,比如滑动了1/5就停在这里,不会自动回退回去,滑动3/5也不会滑动到下一页?IOS那边我去看了下,是一个属性,叫:pagingEable(false)。。。

------------------------------------------------------------------------------------割2014年12月26日09:41:22----------------------------------------------------------------------------------------

目前楼主的处理方式是:

1、viewpager+fragment来实现的。viewpager设置只缓存3页(方法名:viewpager.setOffscreenPageLimit(3);),至于为什么我缓存3页不是一页?请继续看下面;

2、在fragment加载的时候开启一个线程,用来从资源文件里读取图片并设置当前fragment的背景图片。

3、销毁图片(bitmap.recycle()。提示:销毁图片的时候一定要确保图片已经没地方用了,我这里是fragmentLayout.setBackground(null)来确保没用当前图片),这个销毁的方法是放置fragment的onDestroy里。这样就保证了内存里只有3*2+1=7张图片了!当然,如果图片质量较高也可设置viewpager.setOffscreenPageLimit(2);甚至设为默认的1,当然,楼主这里每张图片约400kb,用了现在市场较流行的各7部手机测试过没问题。前面的问题,为什么楼主是设置的3呢?因为设置太小了的话,稍快速滑动会短暂0.x秒的白屏,这样用户体验就不好了。如果设置太高,也会导致OOM!为什么我要用异步(也就是启动线程)来设置背景图片呢?因为加载图片虽然时间很短很短,但还是会影响滑动流畅性。


楼主目前没想到其他更好的解决方式,希望大牛指点!