Android学习笔记整理之常用三种框架:1、MVC模式
发布日期:2021-06-29 01:40:48 浏览次数:3 分类:技术文章

本文共 5565 字,大约阅读时间需要 18 分钟。

目录


MVC框架模型

本章通过具体事例对比使用MVC模型和不使用框架模型的区别,并使用MVC实现对该需求的优化,

总结MVC的优点以及MVC中还可以进行优化的部分。

下面我们将通过代码的方式,来讲解为什么要使用框架?为什么要学习MVC模式?

 

需求:查询用户账号信息

下面我们来看这么一个需求,查询用户账号信息

 

我们先来看一下,这个需求最终实现的一个效果:

失败-显示查询数据失败,成功-显示账号名称、账号等级

         

 

不使用任何框架去实现需求

对于这样一个需求,如果我们不使用任何框架去实现它,会遇到一个什么样的问题?

不使用任何框架要实现这样一个需求,我们可以这样去写:

我们可以创建一个NormalActivity,然后去实现如下这些功能

 

下面我们来看看主要代码实现

布局文件:activity_normal.xml

 

实现类NormalActivity

package com.yyh.testmode1_notused.normal;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.yyh.testmode1_notused.R;import com.yyh.testmode1_notused.bean.Account;import com.yyh.testmode1_notused.callback.MCallback;import java.util.Random;import androidx.appcompat.app.AppCompatActivity;public class NormalActivity extends AppCompatActivity implements View.OnClickListener {    private EditText mEtAccount;//用户输入信息的输入框    private TextView mTvResult;//展示查询结果    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_normal);        initView();    }    /**     * 初始view     */    private void initView() {        mEtAccount = findViewById(R.id.et_account);        mTvResult = findViewById(R.id.tv_result);        findViewById(R.id.btn_getAccount).setOnClickListener(this);    }    @Override    public void onClick(View v) {        String userInput = getUserInput();        getAccountData(userInput, new MCallback() {            @Override            public void onSuccess(Account account) {                showSuccessPage(account);            }            @Override            public void onFailed() {                showFailedPage();            }        });    }    //获取用户输入信息    private String getUserInput(){        return mEtAccount.getText().toString().trim();    }              //展示获取数据成功的界面    private void showSuccessPage(Account account){        mTvResult.setText("用户账号:"+account.getName()+" | "+"用户等级:"+account.getLevel());    }    //展示获取数据失败的界面    private void showFailedPage(){        mTvResult.setText("获取数据失败");    }    //使用Random随机模拟,查询账号数据    private void getAccountData(String accountName, MCallback callback){        Random random = new Random();        boolean isSuccess = random.nextBoolean();        if(isSuccess){            Account account = new Account();            account.setName(accountName);            account.setLevel(100);            callback.onSuccess(account);        }else{            callback.onFailed();        }    }}

 

我们代码功能都实现了,我们会发现在 NormalActivity 中它承担的任务量是比较多的,

比如说它既要获取查询账号数据、然后又要展示成功、失败界面的数据,还要实现成功、失败界面的业务逻辑处理等。

如果一直这样写代码,当我们的项目越来越复杂、功能越来越多,那么NormalActivity里面的代码就会越来越臃肿、非常不好维护,

要解决这样一个问题,我们可以使用mvc模式,mvc模式可以很好的对代码进行优化、解耦,将数据的获取和界面的展示分割开来。

具体代码下载链接:

 

MVC模型简介

我们来看一下mvc模型

下面这是一张mvc比较常见的模型图以及它在android中的映射对象

(1)其中上面的箭头代表事件的传递方向,比如点击一个 view,事件就会传递到 Activity 也就是 Controller 当中。

(2)然后 Controller 再通知 Model 来进行数据的获取,Model 再通知 View 来进行界面的一些展示工作。

(3)事件的传递,比如说要从 Controller 传递到 Model,我们可以直接让 Controller 持有 Model 的引用

(4)Model 要向 View 传递数据,我们一般不直接让 Model 持有 View 的引用,

我们可以使用注册监听的方式来实现,如 callback 等。

 

使用 MVC 框架去实现需求

下面我们使用 mvc 模式对前面的代码进行一些优化处理

这个是上面不使用框架我们实现的一个需求,在 NormalActivity 中它负责了太多的功能。

 

与不使用框架实现需求,进行比较

那么使用 mvc 模式我们需要对它进行一些优化,比如我们要把它的数据获取和界面展示进行分离

我们可以这样做,如下图

之前大部分代码都在NormalActivity,现在我们把它分为三层

使用 MVCActivity 来进行界面展示,使用 MVCModel 来进行数据的获取,View 主要是一些视图布局文件等。

我们会发现为了实现数据获取和界面展示的分离,我们把查询账号数据的功能移植到了Model中。

我们需要实现以下操作

 

下面我们来看看主要代码实现:

界面展示MVCActivity

public class MVCActivity extends AppCompatActivity implements View.OnClickListener {    private EditText mEtAccount;//用户输入信息的输入框    private TextView mTvResult;//展示查询结果    private MVCModel mMvcModel;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_normal);        initView();        mMvcModel = new MVCModel();    }    /**     * 初始view     */    private void initView() {        mEtAccount = findViewById(R.id.et_account);        mTvResult = findViewById(R.id.tv_result);        findViewById(R.id.btn_getAccount).setOnClickListener(this);    }    @Override    public void onClick(View v) {        mMvcModel.getAccountData(getUserInput(), new MCallback() {            @Override            public void onSuccess(Account account) {                showSuccessPage(account);            }            @Override            public void onFailed() {                showFailedPage();            }        });    }    //获取用户输入信息    private String getUserInput(){        return mEtAccount.getText().toString().trim();    }    //展示获取数据成功的界面    private void showSuccessPage(Account account){        mTvResult.setText("用户账号:"+account.getName()+" | "+"用户等级:"+account.getLevel());    }    //展示获取数据失败的界面    private void showFailedPage(){        mTvResult.setText("获取数据失败");    }}

 

数据获取MVCModel

public class MVCModel {    //使用Random随机模拟,查询账号数据    public void getAccountData(String accountName, MCallback callback){        Random random = new Random();        boolean isSuccess = random.nextBoolean();        if(isSuccess){            Account account = new Account();            account.setName(accountName);            account.setLevel(100);            callback.onSuccess(account);        }else{            callback.onFailed();        }    }}

具体代码下载链接:

 

MVC模型优缺点 

优点

一定程度上实现了Model与View的分离,降低了代码的耦合性,也方便了以后我们对代码的维护。

缺点

Controller与View难以完全解耦,并且随着项目复杂度的提升,Controller将越来越臃肿。

Controller 一般是指我们 android 中的 Activity 或 Fragment,所以对于 mvc 模型,有的模型图是这样的。

它是把 View 和 Controller 放在了一块,因为它们非常难以完全解耦。

使用建议

对于mvc的使用建议大家灵活使用,根据自身项目需求来定制属于自己的mvc模式。

 

 

 

 

 

转载地址:https://blog.csdn.net/YuDBL/article/details/107623121 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android学习笔记整理之常用三种框架:2、MVP模式
下一篇:DataBinding使用记录:1、DataBinding的基本用法

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月07日 08时38分45秒