一、前言


由于 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 的操作。 我们分析下事件的流向。

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

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

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

更多相关文章

  1. Android的事件处理机制之基于监听的事件处理
  2. Android电话系统
  3. android Item 滑动删除核心逻辑实现
  4. android onkeydown()简介
  5. Android中EventBus介绍、使用及源码分析
  6. Android用户界面开发:事件处理
  7. android中消费事件的概念以及使onClick和onLongClick同时发生
  8. Android从源码的角度彻底理解事件分发机制的解析(下)
  9. MVP在安卓(Android)整理

随机推荐

  1. Android之UI线程与子线程交互设计的5种方
  2. System Permissions --1.4
  3. android连接小票打印机,打印小票数据的两
  4. SVG和Vector的概念和如何在Android(安卓)
  5. 2.android中使用锁来兼容netty客户端的写
  6. android 是怎样画视图的
  7. 美食家App开发日记1
  8. 提高 Android(安卓)代码质量的4个工具
  9. android studio 获取SHA1(指纹)
  10. Android(安卓)https ssl证书配置(使用okht