欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Activity中onStop和onDestroy方法延迟调用BUG解决

程序员文章站 2022-07-14 18:34:55
...

Activity中onStop和onDestroy方法延迟调用BUG解决

     这个礼拜一功能开发完后,发现一个很奇葩的问题,我写了一个Activity,反复进去和退出,这样重复20次,TV的内存居然从53M升到了惊人的 170M,尝试了解决内存泄露的常规方法的几个步骤:

    (1)  在退出Activity时,把handler的Message和Runnable给干掉

        

  if(getHander() != null){
       getHander().removeCallbacksAndMessages(null);
 }

  

     (2)  Activity context引用不当导致退出时,整个Activity无法回收。程序中我会尽量使用   

           ApplicationContext

 

    (3)  检查添加了Listener接口回调后,没有反注册掉

 

    (4)  List,HashMap等集合类,在退出时clear掉,并置为空

 

    (5)  单例类中是否引用了ActivityContext

 

    在确认按照以上步骤,在我写的代码中都实践了后。结果内存还是老样子,为此我纠结了许久,加上最近看书走火入魔,胡思乱想,最后我居然为此失眠了3天。( ˇˍˇ ) 

   

   后来我又发现了更奇葩的问题,进入该页面一直在loading,而我取消请求只会在onDestroy中进行,后来打印log才发现,原来onStop和onDestory方法在我finish Activity后7秒之后才调用。问题终于找到了。解决呗

     思路:肯定是onStop和onDestroy方法执行了特别耗时的操作,导致Activity的方法阻塞了?

     最终在onDestroy方法中发现了,其他伙伴加的一个语音SDK退出的方法,我把该方法注释

掉了,然后重新启动,看看内存情况,发现onDestroy方法能及时调用了,但是返回退出,结果

onDestroy方法还是会延迟调用。/(ㄒoㄒ)/~~

     后来我发现语音SDK中,有很多的List和map数据,还有好几个回调监听,会不会是这些数据没有干掉引起的?于是我把集合类和监听都在onDestroy方法中给干掉,最后再重新编译下

果然反复退出和进入该Activity,内存始终保持在60M左右。问题终于解决了。。。

     查看语音的SDK发现,Activity启动事会请求接口获取一个很大的HashMap对象,没有把这个对象给干掉,居然造成每次3-5M的内存增加。可见每次在onDestroy时把网络请求的列表数据干掉,是很有必要的。

    总结:onStop方法和onDestroy方法延迟调用是由于语音的SDK内存泄露引起的

  

 

 

 

 

 

 

 

 

 

 

相关标签: 内存泄露