*****
**第一周周考简答题**
[TOC=6]
# 1、简述Handler运行原理
Handler运行原理
异步通信准备 => 消息入队 => 消息循环 => 消息处理
* 异步通信准备
假定是在主线程创建 Handler,则会直接在主线程中创建处理器对象 `Looper`、消息队列对象 `MessageQueue` 和 Handler 对象。需要注意的是,`Looper` 和 `MessageQueue` 均是属于其 **创建线程** 的。`Looper` 对象的创建一般通过 `Looper.prepareMainLooper()` 和 `Looper.prepare()` 两个方法,而创建 `Looper` 对象的同时,将会自动创建 `MessageQueue`,创建好 `MessageQueue` 后,`Looper` 将自动进入消息循环。此时,`Handler` 自动绑定了主线程的 `Looper` 和 `MessageQueue`。
* 消息入队
工作线程通过 `Handler` 发送消息 `Message` 到消息队列 `MessageQueue` 中,消息内容一般是 UI 操作。发送消息一般都是通过 `Handler.sendMessage(Message msg)` 和 `Handler.post(Runnabe r)` 两个方法来进行的。而入队一般是通过 `MessageQueue.enqueueeMessage(Message msg,long when)` 来处理。
* 消息循环
主要分为「消息出队」和「消息分发」两个步骤,`Looper` 会通过循环 **取出** 消息队列 `MessageQueue` 里面的消息 `Message`,并 **分发** 到创建该消息的处理者 `Handler`。如果消息循环过程中,消息队列 `MessageQueue` 为空队列的话,则线程阻塞。
* 消息处理
`Handler` 接收到 `Looper` 发来的消息,开始进行处理。
# 2、简述Mvc和Mvp的特点及区别
MVC
MVC是Model(模型层)、View(视图层)、Controller的组成的一种android开发框架,用一种业务逻辑、数据、界面分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性格定制界面和用户交互的同时,不需要修改业务逻辑的代码。
Model(模型)
是应用程序中处理应用程序数据逻辑的部分,一般用来存储数据
View(视图)
是应用程序中的用户可视界面,也就是用来展示Model层的数据,通常是根据Model的数据来创建
Controller(控制器)
是应用程序中处理用户交互的部分。通常是从View层读取操作信息,Controller在经过一系列的逻辑处理后,改变Model的数据状态,然后Model层将改变之后的数据展示到View层中,Contrller层本身不需要输出任何东西,和做什么处理,只需要接收请求,决定用哪个模型处理请求,和哪个视图返回数据。
MVC有助于管理复杂的应用程序,可以让开发人员单独进行某一层的开发。
优点:
1.耦合性低
视图层和业务层分离,这样就允许改变视图,不用重新编译模型和控制器的代码,同样当业务流程和业务需求改变也只需要改变模型层,应为M、V、C的分离所以很容易改变应用程序的数据层和业务规则。
2.重用性高
允许不同样式的视图共享一个模型
3.生命周期成本低
是开发和维护用户接口的技术含量降低
4.部署快
他可以让一个开发人员专注于业务逻辑的开发,而另一个开发人员专注于界面的开发。
5.维护性高
因为M、V、C层的分离所以更易于维护和修改
缺点:
1.不适合小型和中型规模的应用程序
2.视图和控制器之间过于紧密的连接
视图和控制器是相互分离的,但是他们的联系特别紧密,也就是视图不能失去控制器,控制器也不能失去视图。
MVP
mvp全称Model、view、presenter,MVP是从经典的模式MVC演变而来,他们基本思想有想通的地方,MVC的controller层就相当于MVP的presenter层,负责逻辑的处理,Model用来提供数据,View负责显示。
特点:
MVP和MVC最大的区别就是:在MVP中View并不会直接使用Model,他们的之间的所有通信都是通过Presenter层进行,所有的交互都发生的presenter内部,在MVC中View会直接从Model中读取数据而不是通过Controller.
在MVC里,View是可以直接访问Model的,从而View里会包含Model信息,不可避免的还要包括一些业务逻辑。导致更改View也是比较困难的。
优点:
1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
缺点:
由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。
# 3、简述基类抽取有什么好处(比如在资讯学过的抽取BaseActivity、BaseFragment基类)
1.简化了程序,使得程序的累赘部分减少,使程序简洁。
2.易于派生出其他类。
3.提高代码通用性。
# 4、git与svn的区别
1.svn是集中式的版本管理工具 git是分布式的版本管理工具。
2.git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
3.git可离线完成大部分操作,svn则不能。
4.git有着更优雅的分支和合并实现。
5.git有着更强的撤销修改和修改历史版本的能力
6.git速度更快,效率更高。
# 5、简述从0-1项目开发流程
项目立项 =》需求文档 =》产品原型 =》制定开发计划 =》 开发人员开发 =》严密测试 =》打包上线
- 班规
- 第一单元 Git
- 1.1 Git简介
- 1.2 Git安装
- 1.3 版本控制
- 1.4 远程仓库
- 1.5 分支管理
- 1.6 Git命令总结
- 1.7 在Android Studio中使用Git
- 第一单元 作业
- 第二单元 项目立项
- 2.1 需求文档
- 2.2 原型图
- 2.3 接口文档
- 2.4 项目实现
- 2.5 制定开发计划
- 第二单元 作业
- 第三单元 MVP搭建项目框架
- 3.1 代码架构模式
- 3.2 普通方式写代码
- 3.3 使用MVC重构代码
- 3.4 使用MVP重构代码
- 3.5 使用接口提高代码通用性
- 3.6 内存泄漏
- 3.7 使用契约统一管理接口
- 第三单元 作业
- 第四单元 MVP架构优化
- 4.1 MVP基类封装与泛型应用
- 4.3 BaseActivity的封装
- 第五单元 Volley网络框架
- 5.1 Volley网络框架
- 第六单元 Glide实现图片异步加载
- 6.1 开始使用
- 6.2 占位符
- 6.3 Glide缓存
- 6.4 GlideGifVideo与色彩模式
- 第七单元 传统屏幕适配
- 7.1 相对布局
- 7.1 权重
- 7.3 .9Patch
- 7.4 dimens适配
- 7.5 国际化
- 7.6 shape实现自定义样式
- 7.7 自定义样式
- 7.8 沉浸式状态栏
- 第八单元 RecyclerView
- 8.1 RecycleView
- 第九单元 自定义View
- 第十单元 自定义View实战
- 第十一单元 自定义View进阶
- 第二十单元 属性动画
- 第十三单元 异常捕获机制
- 第十四单元 原生登录、注册模块
- 第十五单元 第三方登录、分享、统计
- 第十六单元 HTML5新特性
- 第十七单元 CSS3新特性
- 第十八单元 WebView与JS交互
- 第一周周考
- 第二周周考
- 第三周周考
- 月考