`
砺雪凝霜
  • 浏览: 151723 次
  • 性别: 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的延迟调用,导致界面一起来就结束了。

相关推荐

    Activity生命周期演示

    活动-销毁:onPause、onStop、onDestroy 日志追踪(完成以下六步、明白android的四种状态的生命周期和相互切换): 1、启动app、查看控制台输出,发现依次触发onCreate、onStart、onResume这三个方法 2、点击按钮...

    android 面试

    android 面试 1. 请描述下Activity的生命周期。  答:onCreate()... onDestroy()Activity从栈中取出时调用,也可以说从第二个Activity返回第一个Activity时,会调用第二个Activity的onDestroy(),销毁Activity

    Activity_04(Activity的声明周期--Activity Lifecycle--代码

    Activity_04(Activity的声明周期--Activity Lifecycle--代码. 包含onCreate,onStart,onRestart,onResume,onPause,onStop,onDestroy 的之行顺序等。。

    可显示onstart、onrestart等调用次序的helloworld程序

    可显示onstart、onrestart、onresume、onpause、onstop和ondestroy的helloworld程序

    可显示onstart、onrestart、onresume等调用次序的hellworld程序

    可显示onstart、onrestart、onresume、onpause、onstop和ondestroy的helleworld程序

    Android面试题-Activity A跳转Activity B,再按返回键,生命周期执行的顺序?

    最近在准备面试,碰到这一题 Activity A跳转Activity B,再按返回键,A、B的生命周期执行顺序是什么?...在B按下返回键会执行:B onPause -> B onStop -> B onDestroy -> A onRestart -> A onStart -> A on

    android下activity生命周期

    android下activity生命周期 生命周期: 回调 描述 onCreate() 这是第一个回调,在活动第一次... onStop() 当活动不在可见时调用 onDestroy() 当活动被系统销毁之前调用 onRestart() 当活动被停止以后重新打开时调用

    Android使用Fragment实现标签页

     Fragment不能独立存在,它必须嵌入到Activity中,因此 Fragment的生命周期也依赖于Activity的生命周期,当其依赖的Activity的某个生命周期方法被调用时,该Activity下包含的所有Fragment的相应生命周期方法也将被...

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化 例如: 切换到横屏 onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume

    henry学习资料

    /** * 关于Activity生命周期的文档很详细,不清楚了... * 第二个Activity如果把第一个Activity完全遮挡住了就会调用OnStop()方法。没有则不会调用 * 对话框风格的Activity在Manifest.xml中加入一个Activity属性即可

    Android学习笔记

    Android初步学习笔记 activity生命周期 ...1、onCreate:第一次被启动、 2、onStart:activity可视时调用、 3、onResume:activity...若启动另外一个activity时,onStop方法未执行,当重新回到第一个activity时直接调用

    实验一Android环境构建与Activity生命周期.doc

    添加Log日志,通过Log日志验证Activity生命周期中的7个方法执行过程; 4. 了解项目的基本文件目录结构,了解Activity周期中的4种状态。 【过程】 (1)建立新项目,实现Hello World; 1)打开Eclipse,选择File -> ...

    Activity生命周期实例讲解

    Activity中有7个与生命周期有关的函数。其中onCreated()是activity第一次被启动时执行的,主要是初始化一些...onStop()表示另一个activity被启动完成时,当前activity对用户同时又完全不可见时才调用的;onDestroy()是

    activiti-userguide-5-16中文开发手册(pdf版)

    首先,Activity是Android... 当然,有些代码只能写在Activity中,不然就运行不了(它们不是生命周期方法),比如你想要获得android系统或者硬件一的些信息,就必须在Activity中写出来,如果单独写一个工具类获得不了。

    实验一Android环境构建与Activity生命周期(1).doc

    } @Override //在可视生命周期结束时被调用,用于保存持久的数据或释放占用的资源 public void onStop() { super.onStop(); Log.i(TAG,"(6) onStop()");} @Override //在完全生命周期结束时被调用,释放资源,包括...

    Activity生命周期Demo

    Activity的生命周期有:onCreate(),onStart(),onResume() ,onPause(), onStop(), onDestroy(),onRestart();

    Android-教程精华-开发

    Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之 中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可 以用onSaveInstanceState保存其状态)。 对于Activity,关键是其...

    Android平台的JavaScript引擎DuktapeJava.zip

    实现Javascript 和 Java的无缝调用。 初始化DuktapeEngnine   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); duktapeEngine = new DuktapeEngine...

    android-activity-lifecycle-demo:一个Android应用程序,展示何时进行各种活动生命周期回调

    背景: android活动的生命周期包括以下回调: onCreate() , onStart() , onResume() , onPause() , onStop() , onRestart()和onDestroy() 。 这些回调为开发人员提供了指示应用程序行为的区域。onCreate() 此...

Global site tag (gtag.js) - Google Analytics