android面试题 持续跟新(三)之android 通信过程

36.IPC机制

Binder是Android中使用最广泛的IPC机制。

IPC:Inter-Process Communication,即跨进程通信

AIDL:Android Interface Definition Language,即Android接口定义语言;用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。

对于Android上层架构,则最常用的通信方式是Binder、Socket、Handler,当然也有少量其他的IPC方式,比如杀进程Process.killProcess()采用的是signal方式。下面说说Binder、Socket、Handler:

1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限

2. 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;

3. 共享内存:无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;

4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;

5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要为

进程间以及同一进程内不同线程之间的同步手段。

6. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等

Binder/Socket用于进程间通信,而handler消息机制用于同进程的线程间的通信

Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:

由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量MessageQueue中添加新Message,主线程一直处于loop()方法内,当收到新的Message时按照一定规则分发给相应的handleMessage()方法来处理。所以说,Handler消息机制用于同进程的线程间通信,其核心是线程间共享内存空间,而不同进程拥有不同的地址空间,也就不能用handler来实现进程间通信。

UI线程可以向工作线程发送消息,也可以是多个工作线程之间通过handler发送消息

52.线程间如何通信?

在android系统中,线程使用的收件箱叫做消息队列(message queue).使用消息队列的线程叫消息循环(message loop),消息循环会循环管理着线程的消息队列。消息循环由线程和looper组成,Looper对象管理着线程的消息队列。

在子线程和主线程通信的过程中,会在主线程中创建一个子线程用于完成耗时操作,操作完成后需要发送一个Handler消息给主线程同时在主线程中声明一个Handler并重写handlerMessage()方法来接子收线程发来的Handler消息来更新UI.

Android中handler的消息传递机制

1.    在新启动的线程中发送消息

2.    子啊主线程中获取、处理消息。

在android中,handler通常和以下组件共同作用

(1),Message: handler接收和处理的消息对象

(2),Looper:每个线程只能拥有一个Looper,它的loop方法负责读取MessageQueue中的消息,读取到消息之后把消息交给发送该消息的Handler进行处理

(3),MessageQueue:消息队列,它采用先进先出的方式来管理Message,程序创建Looper对象时会在它的构造器中创建MessageQueue对象。

(4)Handler:能把消息发送到looper管理的MessageQueue,并负责处理looper分给它的消息。

在线程中使用Handler的步骤如下:

1.    调用Looper的prepare()方法为当前线程创建looper对象,创建looper对象时,它的构造器会创建与之配套的MessageQueue

2.    有了looper之后,创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息

3.    调用Looper的loop()方法启动Looper

54.Handler运行机制

Handler消息处理主要首先是在UI线程中创建一个Handler对象,然后在子线程中调用Handler的sendMessage()方法,接着这个消息会存放在UI线程的MessageQueue中,通过Looper对象取出MessageQueue中的消息,最后分发回Handler的handlerMessage().

Handler一般是与其他线程协同工作,接收其他线程的消息并通过该消息更新主线程的内容。Handler可用于异步请求,网络请求,也可用于定时操作,发送定时消息。Handler机制主要包含4个对象:Message,MessageQueue,Looper以及Handler

Message:线程之间传递消息

MessageQueue:作为一个消息集合,用来存放Runnable和message

Looper不断循环消息队列,只要有消息就从中取出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值