Android面试补习(七)谈一谈Android的消息机制Handler,跨进程通信IPC机制

        这2个概念不仅是Androidd 机制,更是重点,我的目的是分享面试的Android方面的一些基础知识,所以一般情况我不会特别去深究原理,但是今天的概念非常重要,所以为了把握好文章的深度和正确性,我再次花了很久的时候去复习以前的概念,查阅资料。经过非常多的功课,才开始了我的分享。因为阅读的资料比较多,再加上自己的语言去表述,如有错误或侵权请指教。

        Handler和IPC机制,说白了就是线程间通信和进程间通信,那么先分清楚进程和线程的概念。

        进程:Process ,程序的一个运行实例。一个程序Android虚拟机会为其开辟一个进程。也就是说一个进程就是一个程序,一个应用。一个进程包括很多个线程。

        线程:Thread则是cpu调度的基本单位。一个进程最少需要一个线程——>主线程,也就是UI线程。

ps:有人会问一个程序可以开启多个线程吗,答案是可以。在配置文件Acvtivity下加上android:process="com.ryh.chapter_2.remote"。就开启了一个进程,但是莫名其妙的问题就会来了。所以不建议这样做。

先说Android的消息机制Handler吧。大部分情况下,Handler是用来更新UI的,当然不是说Handler只能更新UI,就像现在大家谈的,区块链。比特币是区块链技术,但是区块链不只是只能应用在比特币这样。那既然Handler大部分情况是用来更新UI的,作为我这种级别,就只谈这一方面了。

        大家都知道在Android里,主线程不能做耗时操作,所以才会有子线程。那么子线程完成任务后,如何告诉主线程,老大,我已经搞定了呢。就是通过Android的消息机制Handler。举个栗子:主线程是皇上,我们呢,就是一些当官的(子线程),皇上有他的事,所以一些耗时的复杂的事,就会命令给大臣,大臣做完了,报告皇上,皇上就会更新治理国家的进度。但是我们怎么和皇上沟通呢,经过大内总管啊(太监)也就是Handler

大家需要清楚4个小概念:


Message:信息。比如你要报告的信息是:你已经找到了100个宫女。

Message Queue:消息队列。

Handler:处理消息(Message)的。

Looper:循环器。上面3个沟通的桥梁。

上个图

PS:来自黑马程序视频上个图

        我来解释一下大概的流程。主线程里有个Looper,Looper里有一个消息队列Message Queue,Looper里有个方法叫loop(),它不断的从消息队列里去消息,取出消息后交给消息对应的Handler对象的handleMessage方法进行相应的处理。这是他怎么处理Message。那么Message从那里来呢,从子线程来。子线程调用senMessage方法,发送一个Message到Message Queue,然后就执行上面的操作了。

        上面是简单工作的概念,然后我们稍微深入一点了解,有助于深刻的体会。

        MessageQueue是如何处理消息的。

    

        源码是这些,我就一句大白话解释一下:通俗的说就是,有一堆人需要给皇上报告信息,但是你们得排队一个个来,默认情况先来先说(每个消息都有一个时间的属性),也有的情况是, 大家都在低头做事,没人需要报告,刚好你和老板说点事,那你就第一个直接进去了;或者说大家都要报告消息,迪迦说我还没处理完 3分钟后报告,赛文说我还没处理完5分钟后报告,然后赛罗说我有重要军情立马报告,那就先让这个紧急军情报告;如果赛罗说我1分钟后报告,那么相对于3/5分钟也是先让赛罗报告; 然后忽然来了个人说我4分钟后报告,那么他就需要比一比啊 ,比3分钟慢,比5分钟快,就站他们中间呗  大概就是怎么个情况。其实挺容易理解的。

        Looper:主线程的Looper是主线程也就是Activity创建就自动生成的,而且Loooper.loop()是一个死循环,源码我就不放了,就是一个while(true){}的死循环,循环内就是不停的取消息发送。所以主程序即使不点击,也不会退出。然后还有一个很重要的观点,引用一下简书作者:Carson_Ho的原话:

1.每个线程中只能拥有一个Looper,但是一个Looper可以和多个线程的Handler绑定起来,也就是说很多个线程可以往一个Looper所持有的MessageQueue中发送消息。这就给我们提供了线程之间通信的可能。
2.Handler在创建的时候可以显示指定Looper,这样在Handler在调用sendMessage()投递消息的时候会将消息添加到指定的Looper里面的MessageQueue。如果不指定Looper,Handler默认绑定的是创建它的线程的Looper。

        Handler:并不是只存在主线程,每个线程都可以有很个handler,一个handler只能绑定一个looper,但是一个looper可以绑定多个handler。他们的作用就是在子线程发送消息给MessageQueue,和处理Looper派发过来的消息。

        Message:每一个Message里面保存了一个Handler,所以能调handleMessage方法。

关于Android的消息机制,我只能讲这么多,再讲下去我也不知道该怎么组织语言了。如果大家能理解我目前讲的这个深度,我就知足了。关于更深入的了解Handler源码机制推荐《Android开发艺术探索》。

        还是保持本心,本人只介绍粗浅的概念,让和我一样的初学者对内容有个了解,然后去其他方式深入了解。下面介绍IPC跨进程通信机制。

        IPC的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通讯。多进程的情况分为两种:第一种是一个应用因为某些原因自身需要采用多进程模式来实现,原因有很多,应用特殊原因需要运行的单独的进程中,或者为了加大一个应用可使用内存所以需要通过多进程来获取多分内存空间。另外一种情况是:当前应用需要向其他应用获取数据,由于是两个应用,所以必须采取跨进程方式来获取所需要数据。——《Android开发艺术探索

那么应对这种需求,我们需要采取什么方式满足呢?

套用一下书里面的建议,具体的实现度娘分别研究。

Bundle      优点:简单易用      缺点:只能传输Bundle支持的数据类型 适用场景:四大组件的进程间通信

文件共享  优点:简单易用        缺点:不适合高并发场景,并且无法做到进程间的即时通讯     适用场景:无并发访问情形,交换简单的数据实时性不高的场景 。

AIDL        优点:功能强大,支持一对多并发通信,支持实时通信      缺点:使用稍复杂,需要处理好线程同步   适用场景:一对多通信且RPC需要 。

Messenger   优点:功能一般,支持一对多串行通信,支持实时通信          缺点: 不能很好的处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型        适用场景:低并发的一对多即时通讯,无RPC需要,或者无需返回结果的RPC需求 。

ContentProvider    优点:在数据访问功能很强大,支持一对多并发数据共享,可通过call方法扩展其他操作     缺点:可以理解为受约束的AIDL,主要提供数据的CRUD操作     适用场景:一对多的进程间的数据共享 。

Socket     优点:功能强大,可以通过网络传输字节流,并支持一对多并发实时通信    缺点:实现细节稍微有点繁琐,不支持直接的RPC    适用场景:网络数据交换。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值