00:01
啊。呃,前面呢,我们做过一个功能。我要找到这个功能才好跟大家说啊,啊,那个功能呢,就是昨天我们做了一个欢迎界面,欢迎界面呢。叫叫那个APPLICATION0就它吧,来我把它运行一下。大家就能发现有什么问题。大家没发现没没看清楚是吧?给大家演示一下啊,太快了。哎。我呢,我先准备去点那个他吧,我点我这个应用是不是进入欢迎界面呢?欢迎界面三秒以后,是不是发了一个延迟三秒的消息,进入那个向导界面吧。在这个三秒以内,我点了一下回退键。
01:02
是不是退出来应用啊。先退一下。诶。不是这个吧。啊,先把这个给他。清掉啊,东西太多了。啊,得运行一下,看着这个东西运行找一下我们叫。哎,你们请记他吧。看的啊。进入欢迎页面。退出。这是怎么回事啊?这有点太。太诡异是吧,我都已经退出了,你还把那个。向导一给它启动了。明显我退出是不是把干掉了呀。那干掉了以后,那怎么还在启动呢。
02:04
呃,我们关于页面打开。好看。我们进去以后是发了一个延迟三秒执行的一个延迟消息吧。那延迟执行的消息是三秒之后才执行吗?在一个三秒的过程中,我有可能这个对象就是不要退出啊,我们平常说一退出这个对象是不是就死啊。我跟大家说。根本没死。你要死了,你要死了的话,你想他要死了是吧。你想想,他要死的话,我的憨了,这些东西是不是都应该没有了?关键是他不还在处理消息吗?还不在运行吗?还不来就在执行我的hand me方法吗?那说明。我退出以后死了没有?成为垃圾的样没?没有。
03:00
而且这个里面我创建的是一个内部类的对象吧。也就是说创建的是不是这个welcome activity内部的一个对象啊。我跟大家说,内部的对象有外部对象的引用。就他。你之所以能这么看,是因为它内部有一个引用指向的,也就是说我这是一个对象。Activity对象对吧。那它里面是不是生命的又创建了一个看达?这个里面溜了一个handle的对象。是不是在它内部用了一个匿名内部类对象啊,啊对象呢在这里。跟大家说一下这一个内部类对象,它会有外部对象的一个什么呢?引用,说白了就我这里面有一个隐含的引用,能够找看到activity,这是我的handler。能看到吧。好啦。那为什么我把应用把界面退出以后。
04:04
Handle了,这个activity不回收是因为说有它是吧?那他为什么没有成为垃圾对象呢?是吧?这个handler为什么没有成为垃圾对象呢?是吧,我们是不是发了消息啊。好,那也就是说我们handle了,保存到哪个对象里面呢?知道吧。这当我带大家分析过源码那个message里面有一个属性叫target。还记得吗?它是不是相当于message,能够看到我的handler?也就是说message引用的handle了吧?而我的message放在哪个里面呢?是不是消息队列里面呢。那个消息队列是一直存在的。对吧,Message q就是我的消息队列,消息队列是不是存在啊。
05:03
没问题吧,消息队列不可能消失啊,它一直就一个消极队列在那放着。好啦。那消息队列不消失,你想想看,这消息队列能看到我的message,我的message呢?能看到handler handle了,能看到什么?的,那他当然自然而然不是垃圾对象了。那不是垃圾对象,是不是就不能回收啊?那你说他什么时候成垃圾对象?对吧,我最终消息是不是要处理啊。啊,消息处理以后,大家想啊,来,我们谁来去处理消息,来来去取消息,还记得不是不是呀,Loop是不是从message里面从。消息队列里面把这个消息取出来呀,那这一个关联就没了吧,但是它又被它引用着了,对不对。是这意思吧?好。
06:01
在这个里面啊,看到这里,那message处理完了以后。还做个什么事?还记得不?它是不是有一个缓存的功能啊。把消息消息要处理完了,是把消息里面的数据给清空啊。数据清空,这个就很关键了。这根线没了。他清空是怎么清空呢?是把里面所有的属性都分为。No。对不对,要归零的归零,归纳的归纳,对吧,那这根线就没了吧。这根线没了,我的这一个handle了,和这一个activity就成为孤立的一个两个对象了吧。没人再饮用了吗?那它自然成为什么?垃圾对象。就是说他正常处理。是,也就是说什么时候我的activity才会真正的被回收,大家说我现在这种情况。是不是你真正的把消息处理完了以后。
07:04
才会被回收吧。没问题吧,啊没问题,那好了。那关键是我这种效果你能接受吗?那死谁也接受不了啊,对不对,你一进去以后啊,先看到这个,我一退出,我以为退出了对吧,突然间蹦出一个这个界面了。那跟谁谁也受不了。咋办呢?是吧?这个时候你在想啊,这个这些处理你是默认想着当前的activity是不是还没退出啊。一旦他如果退出了。你应该做什么事情?如果ST已经退出了,你还需要做这个吗?不需要,那怎么样?他不做了。干嘛?移除未处理的消息呗。是吧,你activity什么,那你说我什么时候移了。
08:01
什么是一?第教育里面。怎么移了?Handle了点remove。啊,这个地方我们如果当前的情况可以完全可以这么做,传一个几。是不是传一个一呀,啊传个一。这样移数位数的消息,标数为一的消息吧。但是这个方法是不是只能移出一种消息啊?没以为what为一的,但是有一个方法更厉害一点。叫remove and me,传一个,那这个是移除所有为处理的消息。对吧。那如果我啊,我们一般用下面这个比较比较好用啊。
09:03
如果我这么做了。我们来看一下。啊,贵不贵。还有问题。减压。有吗?没有吧,因为我的消息,为什么呀。是被处理被移除了呀。这移出了好了,其实刚才就有内存泄露的情况。你说我怎么没看见呢?啊,这个地方假设我发的是一个延迟1000秒1万秒的消息了。你这个对象是不是一直都在?对吧,但是我还得不到这个对象吗?大家说。我都退出了,我都点了B了,你你再进来也是重新什么,是不是重新创建的,对不对,因为我已经这个界面当前我已经点回退。啊,退出了。但这个对象呢,确实。
10:01
没有成为垃圾堆象。因为有一用指向的嘛,但是我不可能用了吧。使用不上了。这就是所说的啊内存泄露。只是它这个泄露的时间。不是说特别长对吧。你你发一个言消息,只要消息没处理啊。那个内存是不是就被释放了。因为他就成垃圾对象了嘛,垃圾就会被回收嘛。对不对。嗯,但是这个也是我们经常会说的一种内存泄露的情况。啊,大家需要去注意这样一个事情啊。
我来说两句