在Android的Message里面有这几个比较重要的类:
Looper,
Handler,
MessageQueue,
Message
当然这里面还有一个类ThreadLocal,不过我就不去深入的进行这个类的剖析。
Message说白了就是一个线程往另外一个线程发送消息。让另外一个消息根据传递过来的Message对象进行相关的操作。也就是实现了多线程之间的通讯。
过程是让一个线程拥有一个Looper,看名字是不是很熟悉?是循环的意思,这个类用来遍历里面的成员变量MessageQueue,这个消息队列里面有消息,则拿出来处理。这里是个死循环,唯一的目的就是监听消息队列。
另外一个线程仅仅负责把Message放到MessageQueue里面就可以了
再说一下他们的关系,一个线程有且只能拥有一个Looper,一个Looper有且只有一个MessageQueue
先看线程1:就是负责监听消息队列的线程
Looper looper = Looper.getMainLooper();
handler = new ServiceHandler(looper);
这个handler是一个从Handler衍生出来的子类
我们可以重写父类的handleMessage方法来按自己的逻辑需求处理。
回到上面的代码片段。
Looper.getMainLooper()执行了之后,源码里面说安卓会自动执行prepareMainLooper()方法,这个具体怎么实现的就不管他了。一个代码片段里面只要代码包含在Looper的prepare()和loop()中间,这个线程就拥有了一个Looper。而prepareMainLooper里面就执行了prepare(boolean)这个方法。这里面只有两个逻辑:
1.把这个looper和当前线程进行捆绑
2.new一个MessageQueue对象出来给Looper
接着进行这个操作
handler = new ServiceHandler(looper);
把looper交给handler
在这里我们并不需要显式的去Looper.loop();可能也是因为安卓环境自动执行的吧。Looper.loop()方法主要是遍历MessageQueue,看这个消息队列里面有没有要处理的Message。有的话就拿出来处理。这是个怎么处理过程呢?我看了下源码是这样的:说道这里就不得不说Message了。Message里面有个成员变量
Handler target;
好了,再回到执行的过程,Looper.loop()会死循环这个队列,然后执行 msg.target.dispatchMessage(msg);说多了会晕,那么意思就是Handler里面会有一个方法dispatchMessage(msg),看一下Handler的源码,程序会执行handleMessage(msg);这个就是处理过程,我们唯一做的就是在衍生自Handler的这个类里面重写这个方法。就可以按照我们的意愿去处理业务逻辑。
说的通俗易懂的就是一个线程里面有一个Looper。Looper什么都不干,就看MessageQueue里面有没有Message。有的话就拿出来处理。就干这些事情。
另外一个线程要跟上面的线程通讯只需要给这个消息队列里面添加消息就可以了。
我们使用handler.obtainMessage();从消息池里面看有没有可用的消息,有的话就直接拿出来一个Message。没有的话系统会new一个返回给我们。而执行这个方法的时候Message就会把我们等这个handler跟Message绑定了。也就是上面提到的Message里面的Target。
然后在执行handler.sendMessage(msg);执行这个的时候不要被现象蒙蔽。他不是直接发送消息,而是给消息队列里面添加Message。可能设计者的初衷就是说往消息队列里面添加Message的吧。给消息队列发送完了之后,然后线程1还在不停的loop()。但是这个时候他发现了MessageQueue里面有Message。所以就拿出来处理。
关于MessageQueue里面的指针,取值什么的这里就不说了。这里只是说一个大概的处理流程。让自己mark一下。如果不对,希望有心之人加以指正。
分享到:
相关推荐
### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...
一个牛人写的博客,虽然名为浅谈,实际非常详尽 从注册到事件上传都有,复制下来竟然有140多页,十分惊人 收一元辛苦费,没积分的同学自己看博客吧: ...
Android的消息处理机制是Android系统中实现异步通信和线程间通信的核心组件,主要包括三个关键类:Looper、Handler和Message。本文将深入探讨这三个类以及它们如何协同工作来处理应用程序中的消息。 首先,我们来看...
浅谈Android invalidate 分析 Android 系统中的invalidate机制是View树中非常重要的一部分,它负责对View树进行重绘和更新。当我们对View进行修改时,需要调用invalidate方法来触发重绘过程。那么,今天我们就来浅...
浅谈Android中多线程切换的几种方法 本篇文章主要介绍了Android中多线程切换的几种方法,包括Thread、ThreadPool、Runnable、Callable、Future、Condition、Handler等方法。多线程切换是Android开发中必现的场景,...
Handler机制产生的原因 在谈论一个机制之前,需要了解这个机制设计出来是为了解决什么问题。 Handler设计出来就是因为UI线程不能进行耗时操作,子线程不能更新UI,所以需要一种跨线程通信的机制来解决子线程跑完耗时...
本文将深入探讨Android中的线程池管理,以及与之相关的线程机制,如Handler、Looper和MessageQueue。 首先,我们来了解下Handler的作用。Handler是一个消息处理器,通常用于在不同的线程之间传递消息。它将消息放入...
`WebView`不仅能够渲染HTML、CSS和JavaScript,还能通过特定机制与Android应用进行通信。在上述示例中,`WebView`加载了一个本地的HTML文件`js.html`,该文件包含一个输入框和一个按钮,当用户点击按钮时,...
Android的Dalvik VM有一个内置的GC机制,用于定期回收不再使用的内存,但过度的内存消耗仍可能导致内存溢出(OOM)。 内存溢出通常是由于应用请求的Java堆空间超过了Dalvik VM的HeapGrowthLimit,即使系统总内存...
Android 扩展知识点可能包括 Handler、Looper、Message 三剑客,它们在处理异步操作和主线程通信中起着关键作用。还有 Android 的内存管理、性能优化、ANR 和 Crash 的处理。此外,对 Android 的权限管理、多进程、...
导航传值推荐指数五颗心,适用于相互跳转的页面间传值,且兼容iOS和Android平台。导航传值的核心在于`navigation`对象,该对象由React Navigation自动附加到页面组件的props上。你可以利用`navigation.navigate`方法...