前言
首先,我们先去点一碗麻辣烫。
然后类比点餐的过程,讲解 Active Object 设计模式。
最后讨论 Active Object 模式在安卓主线程中的应用。
一碗麻辣烫
在麻辣烫店里点餐的流程如下:
- 顾客进店,到收银台点菜,收银员记录菜品;
- 顾客拿到号码(对于厨师来说,该号码就是一个顾客),到餐桌等待,不耽误做自己的事情(玩手机、聊天等);
- 收银员将菜品发到厨房大屏幕;
- 大厨在大屏幕上看到菜品,向学徒分配任务,学徒开始做菜;
- 学徒完成做菜,广播号码,顾客取餐;
我们来看下上述过程所涉及的人和物:
- 顾客,点菜;
- 收银员,受顾客委托,向厨师发起做菜请求;
- 被点菜品信号,从收银员传递到厨房大屏幕;
- 厨房大屏幕,以时间先后顺序显示菜品;
- 大厨,负责调度,将做菜任务分配给学徒;
- 学徒,负责具体制作菜肴;
- 学徒做完麻辣烫,喊号,顾客取餐。
好了,如果你只对麻辣烫感兴趣,读到这就可以了。
Active Object 设计模式
Active Object
开讲安卓主线程工作原理之前,我们先来讲讲 Active Object 模式。
在 Active Objective 模式中,有两个线程:客户线程和 Active Objective 线程(以下简称 AO 线程),相当于于顾客和厨房。
在客户线程中,有两类角色:
- Client,调用方,请求的发起者,相当于顾客;
- Proxy,受调用方的委托向 Active Object 线程发起请求,相当于收银员;
AO 线程由以下部分组成:
- Method Request,客户进程发出的方法请求,相当于在收银员和厨房大屏幕之间传递的菜品信号;
- Activation List,方法请求列表,相当于厨房大屏幕;
- Scheduler,调度器,负责调度、执行请求,相当于大厨;
- Servant,实现了 method_1 和 mothod_2 等方法,具体执行方法请求,从调度器接收任务,相当于学徒;
- Future,相当于顾客点菜时取到的号码,用于回调。
综上,Active Object 模式中由如下几个部分组成:
- Proxy
- MethodRequest
- Activation List
- Scheduler
- Servant
- Future
Active Object 模式的优势
该模式主要的应用场景是,在一个线程中调用其他线程中的方法,有效的隔离方法的调用和执行。
店里的顾客有很多(很多客户现场),但厨房(AO 线程)只有一个。
这个现象告诉我们, Active Object 模式能够很好的处理线程的并发和同步。
如果你有幸遇到 VIP 来吃麻辣烫,那他的饭肯定比你先做好(不论你俩号码的先后顺序是怎样的)。
这个现象告诉我们,Active Object 模式能够灵活的改变处理请求的优先级。
安卓主线程工作原理
为了安全,安卓系统只允许在主线程中更新 UI。但是在实际开发中,我们会遇到在非主线程中更新 UI 的情况:我们把耗时操作(如网络请求)放在一个后台线程中处理,需要实时去更新 UI 界面中进度条。
既然在后台线程中直接不能更新 UI,总得给出一个间接更新的方法啊。
解决方案就是 Handler,在后台线程中通过 Handler#sendMessage() 发出更新 UI 的请求到主线程消息队列(MessageQueue),而在主线程中控制器 Looper 收到执行更新 UI 的请求后执行对应的方法(Handler#handleMessage()),从而在主线程中更新 UI。
Handler 模型与 Active Object 模式不完全一致,而是它的一个变形。Handler 既是 Proxy,又是 Servant。
而且,更新 UI 操作没有返回值,故 Handler 模型中没有 Future。
所以,Active Object 模式中的角色和主线程中的各个部分的对应关系如下:
- Proxy,Handler#sendMessage()`;
- Method Request, Message,Runnable;
- Activation List,MessageQueue;
- Scheduler,Looper;
- Servant,Handler#handleMessage();
总结
本文类比麻辣烫,简单讲述了 Active Object 设计模式,及其在安卓主线程中的应用。