回收工作好还是不好?在onDestroy()中
回收工作是指对资源的回收和释放,包括内存、文件、网络连接等。在Android开发中,onDestroy()是Activity生命周期的最后一个回调方法,用于释放Activity所持有的资源。
回收工作的好处:
在onDestroy()中进行回收工作的步骤:
腾讯云相关产品和产品介绍链接地址:
处于暂停状态的Activity仍然是完全存活着的,系统也不愿意回收这种Activity(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的情况下,系统才会去考虑回收这种Activity...销毁状态 一个Activity从返回栈中移除后就变成了销毁状态。系统最倾向于回收处于这种状态的Activity,以保证手机的内存充足。...当活动在完全不可见时进行回调。 ● (6)onDestroy()。 这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。 在活动销毁之前进行回调。...Activity在onCreate()方法和onDestroy()方法之间所经历的就是完整生存期。...一般情况下,一个Activity会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。 ● (2)可见生存期。
如果有什么地方写的不好,请谅解,毕竟我还是个孩子!!! 找出内存泄漏与解决 请各位同学打开我们的开发工具(AS),来跟我一起写个内存泄漏的项目(嘻嘻)。不多说,上代码!!!...这张图大家就可以看到了我们的TestLeakedActivity在内存中存在了8个实力,那么他是被引用的呢?那好我们点击。 ? ? 点击运行。 ?...才对呀,难道是回收不及时导致的么?...然后在截取下内存信息。 ? 哈哈,果然就是没有即使被回收,那么我们说的是对的。上面图片说明了一切。好了既然都找到了内存泄漏的原因,那就去把代码改下喽, ? 这是第一种办法,第二种办法如下: ?...动画也是,及时的停止动画回收资源。 结合WeakReference(弱引用),SoftReferecne(软引用)使用。
处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响,)只有在内存极低的情况下,系统才会去考虑回收这种活动。...你应该在这个方法中完成活动的初始化操作,比如加载布局、绑定事件等。 onStart() 这个方法在活动由不可见变为可见的时候调用。 onResume() 这个方法在活动准备好和用户进行交互的时候调用。...onDestroy() 这个方法在活动被销毁之后调用,之后活动的状态将变为销毁状态。 onRestart() 这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。...完整生存期:活动在 onCreate() 方法和 onDestroy() 方法之间所经历的,就是完整生存期。...一般情况下,一个活动会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法种完成释放内存的操作。
但是如果使用不当还是容易出问题。...,还是会有可能创建多个实例。...答案是使用volatile关键字 volatile关键字能够保证可见性,被volatile修饰的变量,在一个线程中被改变时会立刻同步到主内存中,而另一个线程在操作这个变量时都会先从主内存更新这个变量的值...一直持有MyActivity的引用,MyActivity就不能被回收了。...搞不好也会导致内存泄漏,原因和上面分析的原因一样。
例如,如果你的活动有一个线程在后台运行下载网络数据,它可以在onCreate()中创建该线程【一般在onStart里面创建更好子线程,主要是onCreate()只有5秒的响应时间】,然后在onDestroy...这个问题不好总结,因为不同的应用、不同的Activity所干的事都不一样,有时候我们甚至只需要实现一个onCreate就行了。所以下面所说的,看看即可,不一定符合所有的情况。...3、onStart和onRestart、onStop Activity进入到Stopped状态之后,它极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory...尽管onPause在onStop之前执行,但是onPause只适合做一些轻量级的操作,更多的耗时耗资源的操作还是要放在onStop里面,比如说对数据保存,需要用到的数据库操作。...当然相应的需要在onResume中重启或初始化等等。 有时候也需要在onPause判断用户是调用finish结束这个Activity,还是暂时离开,以便区分处理。
这不好说,如果我们不泄漏Bitmap这种大内存的对象,那么修补内存泄漏就像鸡肋一样,“食之无味,弃之可惜”。...所以内存泄漏足够严重,其危害还是很严重的。 二、实践 对于我们日常开发来说,有比较多的场景稍不注意就会存在内存泄漏的风险。...,也就是说还是要显示的传一个BadActivity中我们需要的变量进来…但是这样有造成了同样的泄漏问题。...但发生GC的时候,告诉GC收集器“我”可以被回收。...不过有一点值得注意的,在Kotlin的Lambda中,如果我们没有使用外部对象的变量或者方法,那么Kotlin在编译时,这个Lambda是不会持有外部对象的引用的。
startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。...没错,不过这种情况还是很好处理的,我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题,代码如下所示: ?...处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的情况下,系统才会去考虑回收这种活动。...活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。...一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。 ❑ 可见生存期。
在Activity中调用finish()或按返回键退出时,若有资源被其他对象引用不能释放(如context被某个单例对象引用或正在线程中被使用),则activity不会被调用onDestory()方法。...isFinishing() 可用来判断Activity是否处于活跃状态(false)还是等待回收状态(true)。...查看源代码中的注释: /** * Check to see whether this activity is in the process of finishing, * either because...有的 你可以在 onPause() 方法里面判断 isFinishing() ,正常调用 finish() 后 activity 的回调过程是 onPause、onStop、onDestroy ,倘若出现上面的情况...但是 isFinishing() 标志还是为 true !你可以释放资源了。
比如:当Activity的onDestroy()方法被调用后,Activity以及它涉及到的View和相关的Bitmap都应该被回收掉。...的onDestroy()方法中调用mHandler.removeCallbacksAndMessages(null);就行了。...,如果在Activity中播放这类动画并且在onDestroy中去停止动画,那么这个动画将会一直播放下去,这时候Activity会被View所持有,从而导致Activity无法被释放。...解决此类问题则是需要早Activity中onDestroy去去调用objectAnimator.cancel()来停止动画。...查了很多资料,发现这是 Android SDK中输入法的一个Bug,在15<=API<=23中都存在,目前Google还没有解决这个Bug。
一.运行状态 当activity在最前端时,它是可见的,有焦点的,可以用来处理用户的常见的操作。如:点击,双击,长按事件等。系统最不愿回收的就是出于此种状态的活动,这会带来非常差的用户体验。...如果当系统内存不足,其他地方需要内存时,它会被系统回收。...3 onResume( )在onstart( )方法中后创建 可以与用户进行交互 此时进入activity的第一个状态 Resumed状态即运行状态。...其后调用onResume( ) 案例 通过两个activity的交互进一步理解生命周期各阶段的用法 分别在两个activity中调用生命周期方法,观察运行时的输出变化 First Activity中:...2继续点击虚拟机的按钮,看到firstactivity调用了onpause方法暂停还是处于可见状态,此时,secondactivity经历前三个方法,完全可交互。
编码的时候养成好习惯,像Activity,Fragment等类在生命周期对等的回调方法中,最好成对的添加代码。例如在onCreate()方法注册监听之后,马上在onDestroy()方法中反注册。...这个Activity每次被打开都会多一个对象在进程中,并且永远不会被回收。 解决办法就是在Activity的onDestroy方法中将Timer取消掉。 3....这些对象不止被Java代码中的引用持有,也会被虚拟机中的底层代码持有。在将持有它们的引用设置为null之前,要先将他们close()掉。 还有一个特殊的类是Bitmap。...在Android系统3.0之前,它的内存一部分在虚拟机中,一部分在虚拟机外。因此它的一部分内存不参与垃圾回收,需要我们主动调用recycler()才能回收。...在单例模式中能用ApplicationContext的都用ApplicationContext,或者把聚合关系改成依赖关系,不在单例对象中持有Context引用; 养成良好的代码习惯。
中还有未被执行的任务,此时退出Activity,GC并不会立即回收Handler,而Handler持有外部Activity的引用,这样就会导致Activity无法被回收,还表现为该Activity的onDestroy...上述代码中构建了一个BigObject对象,但这个对象并没有被强引用持有,在System.gc()之后,该对象就会被回收。...的onDestroy被调用的时候,我们就认为一个Activity处于无用状态可以被回收了,因此我们需要监听每个Activity的onDestroy的调用情况。...可以看到LeakCanary对Activity的onDestroy进行了监听,在Activity调用了onDestroy的时候,将这个Activity通知到RefWatcher中。...在RefWatcher中会将即将被回收的Activity用WeakReference封装,并为它生成一个UUID,记录到retainedKeys中,用来保存应该被回收的Activity的记录。
于是 , 在配合setOffscreenPageLimit预加载的时候 , 由于早期版本的ViewPager至少需要预加载右侧一个页面 , 所以导致在实现懒加载的过程中需要通过 : setUserVisibleHint...: 当Fragment显示/不可见的时候会回调显示状态(isVisible) onResume : 在该回调中判断当前Fragment是否可见 , 如果可见的话 , 进行懒加载 只有通过以上两个方法来进行懒加载...ViewPager2与Fragment配合使用 在ViewPager2中 , 官方将Fragment的生命周期纠正了 , 可以随着ViewPager2的左右切换来回调Fragment当前的状态....向右再翻五页(即展示Fragment6) 当页面缓存超过7个时 , 会将最后使用的Fragment销毁回收 优先创建操作 , 然后再进行回收 , 最后进行展示 // 创建3 E/CardFragmentTag...f7后 , 会回收f0 E/CardFragmentTag: onStop:f0 E/CardFragmentTag: onDestroyView:f0 E/CardFragmentTag: onDestroy
生命周期 Activity的生命周期在配置发生改变时: onPuase->onStop->onDestroy->onStart->onResume 比如在Activity中发生屏幕旋转,其生命周期就是如此...而在onDestroy中,Activity会将其FragmentManager所包含的Fragment都销毁掉(默认状态),即Fragment的生命周期为: onDestroyView->onDestroy...同样,Android文档中对这两个接口也有了一定的描述。 总结 这里结合Fragment.java中setRetainInstance的注释进行一下Fragment非中断保存的总结。...和onActivityCreated还是会被调用。...需要注意的是,要使用这种操作的Fragment不能加入backstack后退栈中。并且,被保存的Fragment实例不会保持太久,若长时间没有容器承载它,也会被系统回收掉的。
今天老九君与你一同探讨,为何面试中你的性格会大过经验 、基础 、算法的考量。...从“基础好”,“算法好”等可以直接观测的量去推测“工作好”的概率,这就是一个在“X好”条件下“工作好”的条件概率问题。 ?...性格 性格是一个复杂的东西,它包含了很多的方面,可以重点考察这些方面: 1、态度积极还是消极。 2、语言表达能力。 3、是否具有用户意识。 4、个性特点,并判断其是否有益于团队。...总结 1、面试官的目标是找到“工作好”的人,一定要围绕这个目标来进行面试; 2、面试过程是通过学历、性格、基础、经验、算法等可以测试的因素去综合判断面试者“工作好”的概率; 3、在各种因素中,性格 >...性格是最重要的,如果性格不好,所有技术能力都会大打折扣,而且技术缺陷容易弥补,性格缺陷很难改变。
[1240] 也就是onDestroy中通过mHandler来移除消息。...[1240] 也就是在退出时onDestroy中移除Message。...从而实现让Scene2Activity可回收呢。 [1240] 于是乎写了一个带有弱引用回调的Handler。...在Scene3Activity中WeakReferenceHandler创建时直接传递匿名的Callback对象。而此Callback对象仅仅被mHandler持有弱引用。...Notice:这一节也就分析分析就可以了,还是要正确的使用Handler。像这样的弱引用的方式其实没必要。 总结 Handler的内存泄露基本都是发送延迟消息导致的。
在 Android 中我们写的 .java 文件,最终会编译成 .class 文件, class 又由类装载器加载后,在 JVM 中会形成一份描述 class 结构的元信息对象,通过该元信息对象可以知道...不能满足被回收的条件,尽管调用 System.gc() 也还是不能得到回收, 这就造成了 内存泄漏 。当然,现在虚拟机基本上都不采用此方式。 可达性分析算法 ?...在 onStrongReference() 内部有一个强引用,这个引用保存在 java 栈 中,而真正的引用内容 (Object)保存在 java 堆中。...在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。...在 AS 中项目以 profile 运行 ? 2. 在 MEMORY 界面中选择要分析的一段内存,右键 export ?
67 地址:http://www.jianshu.com/p/c5ac51d804fa 声明:本文是豆沙包67原创,已获其授权发布,未经原作者允许请勿转载 在上一篇Android内存泄漏的八种可能(上)中,...这种写法开发者是有理由来使用的,所以我们需要正确的释放引用让垃圾回收机制在它被销毁的同时将其回收。...private static View view; @Override public void onDestroy() { super.onDestroy(); if (view !...sensor, SensorManager.SENSOR_DELAY_FASTEST); } 使用Android系统服务不当容易导致泄漏,为了Activity与服务交互,我们把Activity作为监听器,引用链在传递事件和回调中形成了...onDestroy() { super.onDestroy(); if (sensor !
内存泄漏往往面试会问到是否有解决过实际问题,这个如果答不好,也是很容易露馅的,面试时必须得把这艘火箭造好,才有机会进去拧螺丝。其他完整面试专题,请关注公众号查看。...字符串常量池就是在方法区中。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是与Java堆区分开来。...但是如果一个存活时间长的对象持有另一个存活时间短的对象就会导致存活时间短的对象在GC时被认定可达而不能被及时回收,而继续停留在堆内存中,也就是我们常说的内存泄漏。...finalize方法至多由GC执行一次,即使在finalize()方法中复活对象,第二次GC如果对象仍不可达,那么还是会被回收。...10、避免内存泄漏的优化 直接就是针对上面提到的4点进行优化,集合资源add后不用及时remove;Handler使用静态内部类+弱引用,AsyncTask可以在onDestroy()内调用cancel
领取专属 10元无门槛券
手把手带您无忧上云