美文网首页
[Android] 图片自动轮播控件导致内存溢出

[Android] 图片自动轮播控件导致内存溢出

作者: Speronie | 来源:发表于2018-01-16 14:46 被阅读17次

    问题描述

    重复进入Activity再退出的操作,出现OutOfMemoryError。

    问题分析

    回退到上一个版本,重复问题的复现步骤,并没有出现内存溢出现象,于是将范围缩小到新版本中添加的新功能上面。将页面新添加的图片自动轮播控件去掉重试,发现没有出现内存溢出。所以问题应该是出在这个自定义控件上。(虽然也可能存在其他原因,但是这个控件一定是有问题的!)

    自定义控件中使用了ViewPager,自动翻页通过postDelayed()方法定时执行翻页线程实现。查看ViewpostDelayed()方法的源码可发现,里面是通过将actionRunnable线程插入到了ViewPagerHandler中。上网查找ViewPager内存溢出相关资料看到如下一段:

    Activity想要销毁的话,会销毁HandlerHandler要想销毁的话,Handler中不能有任务和Message,因为发送的是延时的任务,因此Handler中很有可能有任务执行,有任务执行的时候Handler销毁不了,Handler又持有Activity的引用,因此造成一个死循环,导致Activity销毁失败。

    虽然这个是针对Activity中的Handler,但是其中Handler的销毁原理应该是相同的。 再结合崩溃时的Log,得出结论就是,自定义控件中的内存溢出是由于Handler中存在未执行完成的Message导致。

    解决方案

    1. 在自定义View需要销毁时,执行handler.removeCallbacksAndMessages(null);方法,主动清空Handler中的任务。

    2. 根据Activity生命周期控制是否执行ViewPagerpostDelayed()方法,只有在当前Activity或控件可见时才在Handler中插入翻页线程。不可见时,执行ViewPagerremoveCallbacks()方法取消对应的线程或removeCallbacksAndMessages()方法清空其任务列表。

    相关文章

      网友评论

          本文标题:[Android] 图片自动轮播控件导致内存溢出

          本文链接:https://www.haomeiwen.com/subject/ebmsoxtx.html