`
砺雪凝霜
  • 浏览: 157040 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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内存泄露引起的

  

 

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 ysc123shift 2019-01-06  
感谢博主,提供灵感并行到了我遇到问题的解决方法:注释onStop、onDestroy中语音SDK中结束的方法。
我遇到的问题是:
由于在onStop、onDestroy增加了结束界面的方法,由于onStop、onDestroy的延迟调用,导致界面一起来就结束了。

相关推荐

    用zgf播放游戏声音(修复退出bug)

    这可以通过重写Activity的onPause()、onStop()或onDestroy()方法来实现。 4. **对象生命周期管理**:如果问题出在对象生命周期上,可能需要重新设计对象的创建和销毁过程,确保在需要时创建,在不再使用时销毁。 5...

    安卓Android源码——LiaTestFragment.rar

    Fragment有自己的生命周期,包括onAttach(), onCreate(), onCreateView(), onViewCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy()和onDetach()等方法。理解这些生命周期方法...

    android碎片测试程序

    Fragment有自己的生命周期,包括onAttach(), onCreate(), onCreateView(), onViewCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()等方法。理解并正确处理这些...

    第一行代码(2)的基本实现

    每个Android活动都有一个从创建到销毁的过程,包括`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, `onDestroy()`等方法。理解这些方法的调用顺序以及何时使用它们是编写高效、响应性良好的应用...

    FragmentDemo.zip

    Fragment有自己的生命周期,包括onAttach(), onCreate(), onCreateView(), onViewCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy()和onDetach()等方法。理解每个方法在何时...

    Android开发指南中文版

    在应用的生命周期管理上,Android应用遵循特定的生命周期模型,包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等方法。理解这些方法的调用时机和目的,有助于编写更稳定、高效的代码。 ...

    Android小知识整理

    包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法,以及它们在用户与应用交互时如何调用。 2. **Intent使用**:Intent用于在不同的组件之间传递消息,如启动Activity或Service,...

    Google Android应用案例开发大全(随书光盘)【源码】

    5. **生命周期**:理解Activity和Fragment的生命周期至关重要,包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法,以及它们在不同用户交互和设备状态改变时的调用顺序。 6. **数据...

    android面试题.zip

    - **Activity生命周期**:理解并能绘制Activity的各个状态,如onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(),并讨论它们之间的转换情况。 - **Intent**:理解Intent的作用,如启动...

Global site tag (gtag.js) - Google Analytics