00:02
嗯啊呃,主要想给大家讲一下,就说我自己对luop跟handle还有ma这个东西的理解啊,呃,它其实主要是用用在线程之间的通信,或者说呃,同一线程下一些事物的推迟,这个工推迟处理这个事情,那我们首先有个概念,就是说在一个应用。比如说一个APA下面对吧,我写了一个a PA papp下面,我当然有好多线程。可能我们将要聊的就是有个UI线程。然后还有我们之前经常说的线程,或者是我自己new一个thread,对吧,New也可以写个线程。那这些线程他们的一个共通性是什么呢?就是说他们可以,他们因为是在同一个进程下面,所以说它们所对应的这块内存。是共享的,也就意味着呢,我这个班的线程,或者说你有W的线程,可以访问UI线程上的某个数据结构。
01:08
数据结构啊。或者说。可以访问一个变量。也可以访问。一个函数。或者说本质上,其实你说变量跟函数有没有那个现成的概念,其实压根就没有现成概念,对吧。说白就是内存的概念,我们能访问到这个内存就行了。那这个概念有了之后,我们就可以来,首先。来简单的举一个很简单的例子。假如我有一个线程。我有个行程。他呢,这个线程不干任何事情,他只做一件事情。不断的去读这个线程。当中它去不断去涂一个变量,这个变量呢,它是一个,嗯。
02:03
List。我们简单的就用list,这个list呢,他发现这个list不为空。嗯,应该说它这个list,如果它发现等于空,它就。嗯,不要不好意思啊,就是说他如果发现这个list不为空,他就去读这个list当中的数据。当中第一个数据对吧,第二个第三个数据。不为空,他就去读里面数据。他就去分别去处理这个数据当中每一个数据,要不你去干嘛,然后呢,呃,这个线程就是不断的在做这样的一个事情。就说不为空,他就去处理这里面的例子呢,123这个事情如果一旦为空的话,它就卡在这。卡在这,这个概念很很重要,就block在这等,我后面会讲这个什么叫block这个概念。那这时候呢,呃,另外一个县城。
03:04
另外一个线程,这个是E。这个。所谓的另外一个线程呢,他拿到了这个list这个变量。然后这个变量作用,它加了一个做了一个A操作。A的操作,A的一个对象。四到这去。然后呢?我们有时候会遇到这种情况。就当。这个死循环它已经把幺三处理完了之后呢,它是处于一种block状态,因为他发现list是等于空的。Size等于零。这时候我的线程二呢,往这个list中去。放一个第四个事情。这时候呢,他要唤醒这个线程,跳出这个循环去再做一次。便利list的这个行为。
04:01
那这里面就牵扯到一个概念,首先嗯,如何让线程block。而且如何让线程能被。第二个线程给唤醒。从而去做他的事情。呃,我不知道这个例子有没有听懂啊,那我们再来捋一遍。再捋一遍啊。首先有一个线程。有一个县城呢,它对一个list。请监听,如list s。等于零。他就卡在这。如果发现它list size不等于零。他就会去。呃。嗯,我就盖这个概念吧。
05:01
这个便利的概念。For完了之后呢,他又回到这个点,就不断的做这样的一个循环的事情。就不断的便利这个对象。一旦这个对象等于零,它就要。Block,睡眠在这里。然后另外一个县城呢?它可以往这个变量。当中放一个事件。一过去,一旦放了事件一过去之后呢,就会。唤醒这个点。让这个县城去跑。他的。的这个一这个事情,并且去做这个事情。不知道这里有没有听听明白啊,这个应该大概都能听明白吧啊,接下来我们就来把这个东西套到我们所说的。嗯,Loop概念。
06:04
首先呢,一个进程当中,它一个线程的,就是用我们正常的一种neww就可以去获个线程。由此外的一个县城之后呢?一个线程对应一个loop对象。这应该所有书上面都会讲一个,现在对一个对象。然后呢,我们可以拿到根据这个loop对象。对应的是绑定多个handle了。都很冷的。In tle up。看到了三。然后呢,你就可以理解为。Loop对象当中,它就有这样一个list。List,它放的是什么?是message。Message它对应的是什么呢?每个message它对应。他到底是处于?跟哪个handle去绑定,其实这些都变量,不要去在意这些东西,就变量,到底他们嵌套关系是什么,你只要清楚的知道。
07:08
我们往。Handle了什么send message也好,是吧,或者说message send to target也好,说白了本质上就是我们在我们当前这个形成。这个我们可以理解为是个loop线程。为什么叫如何线程,因为它任何一个线程啊。呃,你可以理解为所有,嗯,安卓当中所有线程。他只要没有被退出,他要么被block住了,要么再做死循环这个操作。因为如果一旦这个线程执行完了,那线程就YY了,就game over了。我们这个东西就不要再接到这个,现在就已经要被回收了。所以说我们可以理解为其实管它message跟handle的一个对应关系。我们只要清楚知道。我们用handle send message,或者说拿到一个message对象send to target。最关键是要通过。
08:05
我们handler找到对应的loopop对象。因为每个handle的跟loop对象是一一对应的。这样我们可以把对应的message。给投到对应的lo当中的这个list,这个list的这个结束结构呢,它其实是个队列。或者说说白了就是一个链表吧,就是个链表。当然了,我可以告诉你,除了Java层的一个链表。Native层还有一个列表。一个列表。所以说呃,他的这个loop,我们如果看过的一个一个。一个代码当中,我看到它activityw这个类,然后最后会卡在loop.loop这个代码。我们,我可以简单告诉你这个loop.loop。代码是在干嘛?
09:00
其实loop.loop这个代码其实用一个就比较嗯,伪代码的方式来讲的话,就是属于嗯。Wow。或者well。Block。处理。Native。Message。三。处理。Java。的message。就是这个样子,其实大致上就是这个样子,所以说呃,最关键就是如何让这个线的block住,就这个现在问题就牵扯到到后面,就说我们就是想办法要。在两个线程之间能达到一个block加唤醒的一个状态,对吧,如何block并且。
10:00
呃,能换醒,那这里面其实用到了一个就是说就叫依机制,那我这一机制我就呃嗯,它是属于叫做I复用的一个,这你就理解为可以理解为。呃,我们可以往让一。Wait带一个文件。就是托他去监听一个文件。他这个文件一旦。没有内容,没有更改。他就一直卡在这儿,一旦内容有修订,它就可以让这个代码往下走。所以说回过头来。我们的两个代码其实是这个样子的。这是looper线程。它其实是一个死循环。我。他会。一炮吧。
11:00
Wait。再一个文件。然后。处理。或者说循环。处理。Native。别。循环。处理。Java层的变量。变量应该说就是list吧,我们也可以用一些其他数据结构来表示,反正就是一种东西要他要做的事物。是说当我另外一个县城。这个线程我要去往。当前这个loop对应的一个handle的当中去发一个。呃,Handle了,当中去发一个message的时候,其实是这样的,假如我创建message是Java层的一个message,对吧,它首先是把它添加到。这个线程。
12:00
或者这个路线的对应的一个数据结构。然后并且。会往它对应监听的这个文件。当中去发,随便发一个字符串,或者发给我说随便发个叉。好了,这时候文件的内容就已经被改动了,文件内容一旦被改动之后呢?这个代码原来是block主的。他就会接着往后走了。往后走之后,他会发现,哦,这个加构层的list不为空了,他就把他的message取出来。取到mes之后,他就能找到me绑定的handle了,就能把这个变量交给这个handle了,对应当中的handle me方法去处理啊,处理完之后。他又回来,又回来一次。又回来一次之后,发现哦,文件没变动格盯着,所以下次又来一次messagec的一个,之后他又这样做处理。所以本质上。Loop handle了message。的逻辑是这个样子。
13:00
希望大家能理解。如果不理解的话,可以。向我来,呃,可以在我的简书上面可以咨询,我也可以自己再看一下书,来加深我这个印象。嗯,欢迎大家。给我多提点意见,因为我其实嗯,个人就是已经学了挺多年了,就感觉就是很多书讲的太过于。偏代码吧,我希望给大家更多一个概念的一个概念,一些知识点。那如果大家觉得课程好的话,后续会把一些其他知识点以后按照这种黑板形式去给大家讲解,我打算就是说可能后续如果讲这些东西,我会自己去买块黑板,因为我现在用的是pad pad绘制起来好像没那么好。太小了,拍的会值钱。好,谢谢。
我来说两句