您的位置:首页 > 移动开发 > Android开发

麻辣烫与安卓主线程工作原理

2016-12-17 18:46 465 查看
前言

一碗麻辣烫

Active Object 设计模式
Active Object

Active Object 模式的优势

安卓主线程工作原理

总结

参考文章

前言

首先,我们先去点一碗麻辣烫。

然后类比点餐的过程,讲解 Active Object 设计模式。

最后讨论 Active Object 模式在安卓主线程中的应用。

一碗麻辣烫



在麻辣烫店里点餐的流程如下:

顾客进店,到收银台点菜,收银员记录菜品;

顾客拿到号码(对于厨师来说,该号码就是一个顾客),到餐桌等待,不耽误做自己的事情(玩手机、聊天等);

收银员将菜品发到厨房大屏幕;

大厨在大屏幕上看到菜品,向学徒分配任务,学徒开始做菜;

学徒完成做菜,广播号码,顾客取餐;

我们来看下上述过程所涉及的人和物:

顾客,点菜;

收银员,受顾客委托,向厨师发起做菜请求;

被点菜品信号,从收银员传递到厨房大屏幕;

厨房大屏幕,以时间先后顺序显示菜品;

大厨,负责调度,将做菜任务分配给学徒;

学徒,负责具体制作菜肴;

学徒做完麻辣烫,喊号,顾客取餐。



订单



喊号



好了,如果你只对麻辣烫感兴趣,读到这就可以了。

Active Object 设计模式

Active Object

开讲安卓主线程工作原理之前,我们先来讲讲 Active Object 模式。



Active Object 关系图(摘自《Active Object - An Object Behavioral Pattern for Concurrent Programming》)

如上图,在 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 模式能够很好的处理线程的并发和同步。

如果你有幸遇到习大大来吃麻辣烫,那他老人家的饭肯定比你先做好(不论你俩号码的先后顺序是怎样的)。

这个现象告诉我们,Active Object 模式能够灵活的改变处理请求的优先级。

安卓主线程工作原理



Active Object 模式在主线程中的应用(摘自《Active Object - An Object Behavioral Pattern for Concurrent Programming》)

为了安全,安卓系统只允许在主线程中更新 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 设计模式,及其在安卓主线程中的应用。

参考文章

Active Object - An Object Behavioral Pattern for Concurrent Programming

Active Object 并发模式在 Java 中的应用

Section 3: Module 8: Part 1: the Active Object Pattern

Active Object

Droidcon NYC 2015 - How the Main Thread works
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息