Android MVC 架构详解 您所在的位置:网站首页 安卓体系结构中的应用程序设计 Android MVC 架构详解

Android MVC 架构详解

2024-07-03 11:21| 来源: 网络整理| 查看: 265

一、前言

由于 MVP、MVVM 的兴起,MVC 在 android 中的应用变得越来越少了,但 MVC 是基础,理解好 MVC 才能更好的理解MVP,MVVM。因为后两种都是基于 MVC 发展而来的。

二、MVC 详解

我们从网上搜索 MVC 相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图:

到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从 MVC 的发展说起。 MVC 框架模式最早由 Trygve Reenskaug 于 1978 年在 Smalltalk-80 系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型 Model-View-Control。

箭头 → 代表的是一种事件流向,并不一定要持有对方,比如上图中 model → view 的事件流向,view 可以通过注册监听器的形式得到 model 发来的事件。在设计中 model view controller 之间如果要通讯,尽量设计成不直接持有,这样方便复用。也符合mvc的设计初衷 在 Android 中三者对应的关系如下:

视图层(View) 对应于xml布局文件和java代码动态view部分。

控制层(Controller) MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。

模型层(Model) 针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。

由于 Android 中有个 god object 的存在 activity,再加上 Android 中 xml 布局的功能性太弱,所以 activity承担了绝大部分的工作。所以在 Android 中 mvc 更像是这种形式:

因为 activity 扮演了 controller 和 view 的工作,所以 controller 和 view 不太好彻底解耦,但是在一定程度上我们还是可以解耦的。下面我们通过代码来看下,mvc 在 Android 中的实现:

结构很简单,这里介绍下其中的关键代码

public interface BaseModel { void onDestroy(); }

BaseModel 顾名思义就是所有业务逻辑 model 的父类,这里的 onDestroy() 方法用于跟 activity 或者 fragment 生命周期同步,在destroy 做一些销毁操作。

public interface Callback1 { void onCallBack(T t); } public interface Callback2 { void onCallBack(T t,P p); }

Callback 是根据 View 或者 Controller 调用 Model 时回调的参数个数选择使用。

public class SampleModel implements BaseModel{ public void getUserInfo(String uid,Callback1 callback) { UserInfo userInfo= new HttpUtil().get(uid); callback.onCallBack(userInfo); } @Override public void onDestroy() { } public class UserInfo { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }

SampleModel 是我们业务逻辑的具体实现。

public class SampleActivity extends AppCompatActivity { private SampleModel sampleModel; Button button; EditText textView; TextView tvAge,tvName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sample); sampleModel=new SampleModel(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { getUserInfo(textView.getText().toString()); } }); } @Override protected void onDestroy() { super.onDestroy(); sampleModel.onDestroy(); } /** * 获取用户信息 * @param uid */ private void getUserInfo(String uid) { sampleModel.getUserInfo(uid, new Callback1() { @Override public void onCallBack(SampleModel.UserInfo userInfo) { setDataToView(userInfo); } }); } /** * 设置用户信息到view */ private void setDataToView(SampleModel.UserInfo userInfo) { tvAge.setText(userInfo.getAge()); tvName.setText(userInfo.getName()); } }

前面说了 Activity 充当 View 和 Controller,但是我们依然要区分到底哪一部分是 View 的操作,哪一部分是 Controller 的操作。 我们分析下事件的流向。

button 点击事件的触发:View→Controller获取用户信息事件的触发:Controller→Model绑定用户信息到View:Controller→View

至此MVC就讲完了,我们这里根据 sample 来总结下:

具有一定的分层,model 彻底解耦,controller 和 view 并没有解耦;层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有;controller 和 view 在 android 中无法做到彻底分离,但在代码逻辑层面一定要分清;业务逻辑被放置在 model层,能够更好的复用和修改增加业务。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有