Android应用开发之Android架构设计之MVC模式
凌雪 2018-11-29 来源 :网络 阅读 710 评论 0

摘要:本文将带你了解Android应用开发之Android架构设计之MVC模式,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android架构设计之MVC模式,希望本文对大家学Android有所帮助。

vc基本概念">一、MVC基本概念
MVC(Model-View-Controller,模型-视图-控制器)模式在Android中曾经是比较流行的架构设计模式;使用MVC设计模式的好处UI界面与业务逻辑数据的分离,在修改或者优化界面及用户交互的同时,无需重新编写业务逻辑。Android中的MVC的角色如下:
模型层(Model):是用进行业务逻辑的处理,比如一些网络访问操作、数据库的操作等等,总之一些耗时操作的任务。 视图图(View):主要是处理数据显示的部分,在Android中xml布局就可以视为V层。 控制层(Controller):在Android中,Activity是处理用户交互问题,因此通常把Activity或者Fragment视为控制器,通过C层来操作M层获取数据,并把数据返回给V层显示。
二、MVC基本使用
项目目录结构分成了三个目录,分别是model、controller、listener,其中model目录下存放一些javabean类和业务数据获取接口及其实现类(网络访问);controller目录存放Activity或者Fragment;listener目录下是存放网络访问操作结果的回调接口,目的是将数据返回给View层显示。下面一个简单登录为例:

LoginListener接口:其实这个接口实现回调也相当于model层中一部分。
/** * desc:登录回调监听 */ public interface LoginListener<t> {     /*请求前一些准备,比如加载提示等待*/    void onStart_();     /*访问成功调用*/    void onSuccess(T t);     /*访问失败*/    void onFailed();     /*访问结束*/    void onFinish(); }</t>
Model层:
/** * desc: 用户信息实体类 */ public class UserInfo {     private String userName;     private String sex;     public String getUserName() {        return userName;    }     public void setUserName(String userName) {        this.userName = userName;    }     public String getSex() {        return sex;    }     public void setSex(String sex) {        this.sex = sex;    }}
/** * desc: login-Model */ public interface LoginModel<t>{     void getUserInfo(String userName, String pwd, LoginListener<t> listener);}</t></t>
/** * desc:LoginModel的实现类,网络异步访问 */ public class LoginModelImpl implements LoginModel<userinfo>{     @Override    public void getUserInfo(String userName, String pwd, LoginListener<userinfo> listener) {         UserInfo userInfo = new UserInfo();        userInfo.setUserName(userName);        //下面是模拟网络访问结果的调用        listener.onStart_();        if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(pwd)){            listener.onSuccess(userInfo);        }else {            listener.onFailed();        }        listener.onFinish();     }  }</userinfo></userinfo>
View层:xml布局
<!--?xml version="1.0" encoding="utf-8"?--><linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="https://schemas.android.com/apk/res/android">      <edittext android:ems="10" android:id="@+id/et_user_name" android:inputtype="textPersonName" android:layout_height="wrap_content" android:layout_width="match_parent">     <edittext android:ems="10" android:id="@+id/et_password" android:inputtype="textPassword" android:layout_height="wrap_content" android:layout_width="match_parent"><button android:id="@+id/but_login" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="登录"></button></edittext></edittext></linearlayout>
Controller层:
public class MainActivity extends AppCompatActivity implements LoginListener<userinfo> {     private EditText mEtName;    private EditText mEtPassword;    private Button mButLogin;    private LoginModelImpl mLoginModel;    private ProgressDialog mProgressDialog;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         mEtName = findViewById(R.id.et_user_name);        mEtPassword = findViewById(R.id.et_password);        mButLogin = findViewById(R.id.but_login);        mLoginModel=new LoginModelImpl();        mButLogin.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //登录                String userName = mEtName.getText().toString();                String pwd = mEtPassword.getText().toString();                mLoginModel.getUserInfo(userName,pwd,MainActivity.this);            }        });     }     @Override    public void onStart_() {        Log.d(TAG, "onStart_: ");        mProgressDialog=new ProgressDialog(this);        mProgressDialog.setTitle("请求中……");        mProgressDialog.show();    }     @Override    public void onSuccess(UserInfo userInfo) {        Log.d(TAG, "onSuccess: ");        mProgressDialog.dismiss();        Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();    }      @Override    public void onFailed() {        Log.d(TAG, "onFailed: ");        Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();    }     @Override    public void onFinish() {        Log.d(TAG, "onFinish: ");        mProgressDialog.dismiss();    }     private static final String TAG = "MainActivity";}</userinfo>
上面例子是MVC的简单运用,当你点击登录就是获取登录数据,通过modle层中的接口实现类(LoginModelImpl)来获取网络数据,并把数据返回View层显示交互,从上面例子可以看出,Controller控制器Activity一定程度上实现了视图UI层与数据Modle层的解耦,将View层和Modle
层进行了分离,但并不是十分完美,就是在Controller层Activity中同时存在布局视图初始化和业务逻辑操作响应,也就是View层初始化和Controller层同时绑定到同一类中。当业务越来越复杂时,Activity的职责会越来越多,代码会越来越浮肿,不利于后期的维护。  

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程