android mvc使用方法,详细学习android mvc设计模式教程

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 web 应用程序的模式。其分层有助于管理复杂的应用程序,因为可以在一个时间内专门关注一个方面。例如,可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

fcfa905d1562372e6cfa0da4a0d96a58.png

想在你的 Android 应用里优雅地分离出应用状态、用户交互和数据表现吗?

一个开发平台的设计者是的不会有闲工夫为你量身打造一个高层的应用架构的。但是你恰恰可以利用这一点,充分利用你的自由,根据应用需求和规模来实现你自己的架构。如果你仅仅要做些简单的小玩意儿,那么好吧,你可以随意在你的 widgets(像 text fields、spinners 之类的)中存储数据,然后就在诸如 OnClickListener 中去操控它们。可是话又说回来,如果你要写些宏伟的应用,或者想让你的小玩意儿更丰富迷人一点呢?那你还是考虑考虑分个层吧,因为一个好的架构会鼎力支持你去添加新特性,满足你梦寐以求的高性能、高灵活性、高度响应性等等需求。当然,你的代码也会因此摆脱蓬头垢面心乱如麻的糟糕状态,从此过上幸福的生活……

好吧,说正经的。在接下来的几分钟的光阴里,我将带你看一看如何根据大名鼎鼎的 MVC,来把你的代码大卸三块。三块之间还是藕断丝连的,比如我会告诉你怎么用 Android 的 messaging 框架,来把 view (V) 和 controller (C) 连一连。我把这一实践应用到我自己的代码中,也许它并非 100% 的符合学术标准,也可能不是对每一个 app 都能成为天作之合,但是当我的应用变得越来越庞大的时候,我还是很享受它所给我带来的好处的。

6ed4354f9b9b31ed17cdc710f6fd55c6.png

简介

关于这个 MVC,我就不多说了吧,到处都可以找到它的“广告”。我也不介意你到我写的 里面看一看。你最好先了解了解 Model,View,Controller 这三个东西。另外呢,如果你还没有看过 ,最好还是去看看吧。尽管这篇文章里没有完整描述 messaging 这朵奇葩,你还是可以在里面打听到一些关于线程模型的八卦。接下来我会一直带你绕着一个样例转一转,转到最后你会看到样例的源代码。

Part 1: Model

把 Model 层泛化,并且让它只能接触到主逻辑,这是一个不错的开端。我们的样例看起来其实是一目了然加了无趣味,但还是有些有趣的地方。首先,我们有一个单独的类来包含 model 的“数据”——指的是,在应用的生命周期中, Model 层内可能发生变化的各种状态。

1d418f452aae7238079929c4ca09a6c6.png

呃,你没有看走眼,我的确喜欢加个标注叫 @Immutable,这样一来我就会铭记这个类事实上是永恒不变的。这样有很多好处,比如说我能够在线程之间共享一个类的实例。另外,我还让这个类 Serializable,这样可以允许我实现一些例如 “Save/Load” 之类的特性。

至于 Model 类本身,它长成这个样子:

2a1b9ab53bc93817f57566ce965056ec.png

2c1b054945e74b36f5e0a135a2e8a655.png

方法 updateData() 要花一点时间来执行,在真实世界里,它可能是在请求服务器、执行繁重的计算等。data 被 synchronized 好好地保护了起来,不会被并发地访问。Listeners 也能安全地从并发线程中被添加或删除。如果你已经和 MVC 有过交往,你会意识到 model 的 listeners 是这个模式的中坚力量——它们让你能把任何代码附加到 model 上,而 model 却对此一无所知(因此 model 的代码就可以免受任何不相干的逻辑注入的伤害)。

现在来看最有意思的部分——Controller 层。

Part 2: Controller

其实吧,你可以通过很多种方式实现 Controller 这一层。 我选择的方式是基于 Handler, HandlerThread 与 Message 类的方法。当然,你多少要懂点它们的工作方式。

说到底,Android 平台让你可以通过这几个类来实现应用中各部分之间高效、安全且强大的 messaging 通信。在我们的例子里,我想做的的东西是:

送给 Controller 一个 inbox handler——这样 View 层就能给他写信(message)了,信的内容可以是“用户让我退出”或者“用户让我更新这些数据”以及其它一些甜言蜜语。

送给 Controller 一个或多个 outbox handlers——这样 Controller 就也能给 View(或 Views,比较多情,你懂得)写信(message)了,比如“ model 已经更新完了”或者“你自杀吧,我要退出了”,等等。

通过这样的方式,View 只能把用户事件装在信封(message)里寄给 Controller,并不用自己决定怎么对用户事件进行反应。一旦 Controller 给 View 寄来一封信(message),View 就会无脑地处理 Controller 告诉她的事情,并且给用户呈现出一些应用的状态。

通过这样一个悲情的故事,我们很干净地就实现了 MVC 的架构,虽然有点不太仁义。

由于 Handler 需要一个 Looper,我们需要选择一个线程,来运行 Controller 的 inbox handler。我们可以选择在 UI 线程中(它既能处理 UI 消息,又能处理 Controller 的消息)或者一个新的单独的 HandlerThread 中来运行。通常我们的 Controller 不会被困在一个很慢的操作中处理它的消息,这样它才能即使对 View 作出相应。所有很慢的操作都会在后台线程中运行。因此我们可以放心让

UI 线程来处理 Controller 消息。但是我还是选择运行一个单独的线程,仅仅是因为这样看起来架构会比较干净,也可能因为这样 Controller 的响应会有一点点的更快吧。既然 messageing 框架帮助我们摆脱了并发问题的牢笼,我们可以不用修改大量代码,就轻易地从一个 solution 跳到另外一个。

来看看我们管理 inbox handler 和 outbox handler 的代码:

1641da8df265c078152c82b5b4436ae7.png

76ff1b2c8c983c549829f9d02c2326c7.png

这些并不是 Controller 的完整代码。先说点其它的我们马上回来。你现在能看到的是我们如何初始化 inbox handler 与它的线程,如何提交一个 handler 到 outbox handlers 中去,以及如何用一个消息通知所有的 outbox handlers。

有了这些代码,我们可以得到 inbox handler,并可以从 View 层向它发送消息,同时我们有绑定了 View 的 outbox handler,能够让 Controller 与它的 Views 有效地交换异步消息。

为了能处理收到的消息并做点什么,我们需要在 Controller 类中实现 handleMessage() 方法。在大部分应用中,你都可能想在这里实现一个设计模式中的状态模式的实例,因为根据应用正在处理的工作的不同,我们可能需要对一个消息进行不同的处理,乃至忽略一些消息。例如,在我们的应用中,一旦你开始刷新模型了,你肯定不希望用户在刷新完成之前再刷新一次。为了表明这一点,我给出了 ControllerState 接口和它的 ReadyState 的实现:

53dea400f0ba5757c27e9df3ab52c74d.png

312885a7f4a163a6dfd6d12b0f7d41eb.png

把 Controller 和它的状态们(stages)放到同一个 package 中,我们可以让它们使用默认访问级别就能访问到 Controller 的内部。我就不把 UpdatingState 的代码贴这儿了,在页底的附件中都有。

这里看看 Controller 是怎么把消息处理委托给它的 state 的:

c62b88ea287233948a25bacf58af1552.png

c51cfe23d7ed9a5e6773aa0e9a0a48ba.png

好了,Controller 大概就是这般模样,现在让我们介绍个 View 给它认识认识吧。

Part 3: View

不用过多解释了,我猜你已经知道怎么做了。上代码(DemoActivity):

8670dd41599f7250b80cbe418ca66a8a.png

ea1e9755685ff893b7e52b7ffdb770e5.png

0747095a4fc022e46643fe332d816df2.png

在这一样例中,Activity 实际上占据了 Controller 的实例,而这个 Controller 是控制着 model 的。然而,如果你觉得 Service 的生命周期更能匹配 Controller/Model 的生命周期的话,你也可以考虑把 Controller 转移到一个 Service 中。

总结

你现在应该很清楚了,基于 message 的方法的的确确能允许我构建一个强大的、复杂的 Controller 与一个完全百依百顺的贤惠的 View。这样我们就有了一个很好的 MVC 的实现。

正如我在开头所写的那样,这一解决方案从理论上讲不一定完全有效,也不一定就适合你的 app,但是我已经经历了构建一个非常复杂应用的过程,这中间有很多种状态,并且它完全依赖于消息。这一架构会有很多弱点,比如你要在某个地方聚合 message 的代码(见ControllerProtocol)并在文档里定义很多 message 参数。但是别忘了好处:它很好地实现了层间的分离,当你的 app 越长越大时,你更会体会到这一框架的美妙。

mvc设计模式详细分析到这基本交完了,主要是通过简单的文字和详细的代码来介绍了MVC的三部分,分别是Model(模型)、View(视图)和Controller(控制器)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android l 电池,DIY新技能--M1L换电池

DIY新技能--M1L换电池2019-10-23 16:48:526点赞6收藏10评论更换理由M1L是好几年前买的了,具体几年前我都懒得购买记录了。前前后后买了4台锤子手机了,这是我支持老罗的第二款手机,前一款是坚果手机,买了两台早先给妈妈用一台后来给…

android版本10好不好,一加正式推送Android 10系统 流畅性怎么样

近日,一加正式推送Android 10系统,不知道流畅性如何呢?一加官方推特正式宣布Android 10系统已进行阶段性推送,从今天开始一加7和一加7 Pro手机用户将会陆续收到氧OS系统的更新,国内基于Android 10的氢OS将于下月推送。…

android屏幕适配流程,Android屏幕适配姿势

GitHub地址为什么要屏幕适配?device_framentation.png统计碎片化品牌机型碎片化屏幕尺寸碎片化操作系统碎片化为了保证用户获得一致的用户体验效果,使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,则需要我们进行屏幕…

在html中写js提示错误,页面HTML标签优化

真正需要SEOer掌握并经常使用的HTML标签也就那么几个,本小节错误君带来的是页面HTML标签优化。title标签 – 标题标签1)title标签用法2.13 TF-IDF加权方法 – 错误教程2)标题标签的作用文章标题有着关键词的作用,文章标题引点击流量。3)页面标题标签优化…

在线聊天室html5源码,HTML5WebSocket实现聊天室的代码示例

本篇文章主要介绍了HTML5-WebSocket实现聊天室示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。在传统的网页实现聊天室的方法是通过每隔一段时间请求服务器获取相关聊天信息来实现,然而html5带来的websocket功能改变这了这种方式&am…

列表页时间日期标签靠显示html,帝国CMS列表页面list.var分别调用年月日,显示个性时间日期...

在帝国CMS中列表页个性时间显示的实现方式,首先我们要知道用什么方法来实现,这里我们使用PHP代码来做。要在模板代码中使用PHP代码,就必须勾选此模板代码页面的-使用程序代码.位置就在添加模板页面的列表内容模板(list.var) (*)上边。然后我们在list.var…

html鼠标响应事件吗,学习JavaScript鼠标响应事件

本文为大家分享了一个简单的鼠标模拟案例,供大家参考,具体实现内容如下如何实现捕抓鼠标事件,当鼠标滑动时,获取当前鼠标的坐标,接着在一个透明区域里绑定捕抓的位移,这样就能在模拟的透明区域里实现鼠标滑…

html5边框闪烁,HTML – CSS框阴影动画像素艺术闪烁

部分用于测试,部分用于我的设计理念,我试图将动画gif转换为纯动画CSS.它几乎正常工作,但我遇到了障碍,我不确定是什么导致了我的问题,或者我如何解决它.我不幸地怀疑我只是限制了技术.至于实际的CSS,我一直在尝试实现这里的方法(动画框阴影属性),因为它看起来最可行&#xff1a…

如把联想电脑计算机图标放在桌面上,thinkpad电脑图标没了怎么恢复

正常情况下,在电脑的桌面上都会有系统自带的程序图标,以及用户自己创建的一些图标。可是最近有网友却跟小编反映说,自己thinkpad电脑出现了图标都没了的情况,不知道怎么回事,更加不清楚怎么恢复。那么对此今天本文就来…

未来计算机领域最急缺的人,未来十年最紧缺职业 没人愿意干的高薪职业

未来十年最紧缺职业 没人愿意干的高薪职业2019-03-19 09:25:56文/刘美娟未来十年中国最紧缺的高薪职业类型有:金融分析师、理财规划师以及动漫设计师等。未来最紧缺的高薪职业金融分析师金融分析师是证券投资和管理界的高级人才,目前我国能够真正拿到特许…

口琴膜片什么作用_思域发动机舱里的这个东西是什么东东,它究竟有什么作用呢?...

​今天的文章我们主要来讲讲图中的这个东西究竟是什么?你们知道他是干什么的吗,这个东西究竟有什么作用?这是前几天的一个微信网友添加我微信问我的问题,今天对这个问题整理了一下,顺来来科普一下关于这个系统的具体应…

椭圆形中间一个大写的v_静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊_冠桥橡胶...

首页 > 新闻中心发布时间:2020-12-11 07:22:18 导读:冠桥橡胶为您提供静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊的相关知识与详情: 分集水器上,由于主要功能是调节,般选截止阀或闸阀。后来又出现了一种新…

计算机专业独显好还是集显好,笔记本选购指南:笔记本电脑核显好还是独显好?...

暑期装机热潮来了,而大部分大学生会选择入手一台笔记本而不是笨重的台式机,今天这里主要讲下笔记本选购指南,笔记本电脑核显好还是独显好?可能这个问题提出来,大家就要说很外行。不过既然是写给不太懂电脑的人看&#…

oracle查同比增长_天眼查:目前我国今年新增2.3万家充电桩相关企业,同比增长16.94%...

天眼查专业版数据显示,目前我国有近10万家经营范围含“充电桩、新能源智能充电、电动汽车充电”,且状态为在业、存续、迁入、迁出的充电桩相关企业。从地域分布来看,我国充电桩相关企业较多集中在广东、山东和江苏这三个省份,其中…

速卖通手机端怎样加入html,如何正确使用速卖通手机版的关联营销模板

如何正确使用速卖通手机版的关联营销模板旺销王发表于:2018年11月15日 17:47:22更新于:2019年08月07日 15:19:13很多速卖通卖家都在群里跟小编反应一个问题,为什么没有单独生成手机速卖通详情的速卖通产品的速卖通关联营销在速卖通店铺是可以…

能用来写安卓吗_iPad能代替笔记本吗,除了看剧还能用来做什么?

今天想和大家分享一下我手里的这台iPad Pro。关于它主要是两个方面:● 我自己用它会做哪些事情?● 分享几款我觉得好用的的iPad app(最后会附上我个人关于iPad的选购建议)首先,它不是我的第一款iPad产品。在我大二的时候,我非常幸…

c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...

【题记】宝石虽落在泥土里,仍是宝石,砂粒虽被吹到天空中,还是砂粒。——莎士比亚不是有水的地方就有青蛙,但是青蛙叫的地方必定有水。——歌德【配合教材】本探究配合“因数与倍数”。通过本探究能够帮助学生巩固所学知识&#xf…

中北大学和陕西科技大学计算机专业,西北地区两所重点大学,中北大学和陕西科技大学...

中北大学,位于山西省太原市。山西省属重点大学,省部共建高校。中北大学创办于1941年5月,时名太行工业学校。建国后迁入现址,更名为华北兵工职业学校。1958年升级为太原机械学院。1961年合并现北京理工大学4个常规兵器专业&#xf…

cxgrid 行合并单元格_合并单元格求和、计数、加序号

合并单元格求和同时选中D2:D13单元格区域,编辑栏输入公式后按Ctrl回车:SUM(C2:C13)-SUM(D3:D13)有两个地方需要注意,一是输入公式后,要按Ctrl回车。二是注意第二个SUM函数的起始引用位置,是公式所在单元格的下一个单元…

清华大学计算机系男女比v,清华男女生比例惊人,但找女朋友却不愁,这是为什么?...

对于学生来讲,十八九岁就是恋爱的年龄,由于上高中我们有升学的压力,所以到了大学以后,多数人都会轰轰烈烈谈一次恋爱,但对于理工科为主的大学来讲,由于男女比例严重失调,谈恋爱就成了一种奢侈。…