ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
***** **第一周周考简答题** [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项目开发流程 项目立项 =》需求文档 =》产品原型 =》制定开发计划 =》 开发人员开发 =》严密测试 =》打包上线