Android架构设计——MVC

Posted 涂程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android架构设计——MVC相关的知识,希望对你有一定的参考价值。

目的

架构设计的目的是通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合。提高开发效率,且能方便后续的测试及问题定位。但是对于不同量级,不同需求的APP,适合的架构是视情况而定的,切不可硬套架构。

定义

MVC是Model View Controller的缩写,它是指模型(model)-视图(view)-控制器(controller)这一设计架构。其中:

  • Model(模型层):负责数据的加载和存储

  • View(视图层):负责界面数据的显示,与用户进行交互

  • Controller(控制器层):负责逻辑业务的处理

流程

目的

架构设计的目的是通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合。提高开发效率,且能方便后续的测试及问题定位。但是对于不同量级,不同需求的APP,适合的架构是视情况而定的,切不可硬套架构。

定义

MVC是Model View Controller的缩写,它是指模型(model)-视图(view)-控制器(controller)这一设计架构。其中:

  • Model(模型层):负责数据的加载和存储

  • View(视图层):负责界面数据的显示,与用户进行交互

  • Controller(控制器层):负责逻辑业务的处理

流程

  • View接受用户的请求,然后将请求传递给Controller。
  • Controller进行业务逻辑处理后,通知Model去更新。
  • Model数据更新后,通知View去更新界面显示。

android中的MVC

Android中界面部分也采用了MVC框架:一般由Activity充当Controller,XML文件作为View层,再加上我们抽离出的Model层。

视图层(View)

一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。使用的时候可以非常方便的引入,且便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

控制层(Controller)

Android的控制层的重任通常落在了众多的Activity的肩上。Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。所以一般不在Activity中写耗时操作代码,要通过Activity交割Model业务逻辑层处理。

模型层(Model)

我们针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidApp的Model,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在该层的。

各层内容

Android MVC小例子

下面来看一个简易的demo代码,它的功能是:点击屏幕上的刷新按键后,给出应用运行的时长。

代码

//Model层
public class TimeModel {
    private static final long START_TIME = System.currentTimeMillis();
    public void update(ControllerActivity controllerActivity) {
        //更新数据
        String timeText = Double.toString((System.currentTimeMillis() - START_TIME)/1000.0);
        //更新UI
        controllerActivity.setText(timeText);
    }
}
<!-- View层 -->
<LinearLayout xmlns:android=
    "http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="@string/time_text"/>

    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/update_button"/>
</LinearLayout>
//Controller层
public class ControllerActivity extends Activity {
    private TimeModel timeModel;
    private TextView textView;
    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controller);
        timeModel = new TimeModel();
        initView();
    }

    public void initView() {
        textView = findViewById(R.id.tv_show);
        button = findViewById(R.id.btn_update);
        //接收来自View的事件
        button.setOnClickListener(v -> {
            //通知Model处理数据
            timeModel.update(ControllerActivity.this);
        });
    }

    public void setText(String timeText){
        String text = "应用已运行" + timeText + "秒";
        textView.setText(text);
    }
}

运行结果

缺点

上述例子中各个组件的职责似乎挺符合MVC设计理念,但在实际的开发过程中我们发现并不是这样。

Android中作为View的XML视图功能太弱,Activity基本上可以算作View和Controller的合体,既要负责视图的显示又要加入控制逻辑,造成了Controller层与View层的耦合。在Android中写出来的MVC更加类似于View-Model 模式:

所以说,在Android开发中使用MVC架构,的确有诸多束缚。寻找更合适的设计架构,已是大势所趋。

最后

小编学习提升时,顺带从网上收集整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要参考的可以直接去我 CodeChina地址:https://codechina.csdn.net/u012165769/Android-T3 访问查阅。

以上是关于Android架构设计——MVC的主要内容,如果未能解决你的问题,请参考以下文章

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

Android架构设计——MVC

APP架构设计

APP架构设计

架构浅谈之 MVC

Android Java:在 onCreateView() 中返回空视图的片段