###简述
在Android开发中,比较流行的开发框架模式采用的是MVC框架模式,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。

那么Android项目中哪些代码来充当M,V,C角色呢?

  • Module层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。

  • View层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。

  • Controller层:在Android中,Activity处理用户交互问题。

    • 因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

###简化的交互图
所以我们来重新温习一下MVC的交互图

###代码
Talk is cheap,show me the code.(废话少说,直接上代码)

Controller层(主要是Activity)

import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.xjp.androidmvcdemo.R;
import com.xjp.androidmvcdemo.entity.Weather;
import com.xjp.androidmvcdemo.entity.WeatherInfo;
import com.xjp.androidmvcdemo.model.OnWeatherListener;
import com.xjp.androidmvcdemo.model.WeatherModel;
import com.xjp.androidmvcdemo.model.WeatherModelImpl;public class MainActivity extends ActionBarActivity implements OnWeatherListener, View.OnClickListener {private WeatherModel weatherModel;private Dialog loadingDialog;private EditText cityNOInput;private TextView city;private TextView cityNO;private TextView temp;private TextView wd;private TextView ws;private TextView sd;private TextView wse;private TextView time;private TextView njd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);weatherModel = new WeatherModelImpl();initView();}/*** 初始化View*/private void initView() {cityNOInput = findView(R.id.et_city_no);city = findView(R.id.tv_city);cityNO = findView(R.id.tv_city_no);temp = findView(R.id.tv_temp);wd = findView(R.id.tv_WD);ws = findView(R.id.tv_WS);sd = findView(R.id.tv_SD);wse = findView(R.id.tv_WSE);time = findView(R.id.tv_time);njd = findView(R.id.tv_njd);findView(R.id.btn_go).setOnClickListener(this);loadingDialog = new ProgressDialog(this);loadingDialog.setTitle(加载天气中...);}/*** 显示结果** @param weather*/public void displayResult(Weather weather) {WeatherInfo weatherInfo = weather.getWeatherinfo();city.setText(weatherInfo.getCity());cityNO.setText(weatherInfo.getCityid());temp.setText(weatherInfo.getTemp());wd.setText(weatherInfo.getWD());ws.setText(weatherInfo.getWS());sd.setText(weatherInfo.getSD());wse.setText(weatherInfo.getWSE());time.setText(weatherInfo.getTime());njd.setText(weatherInfo.getNjd());}/*** 隐藏进度对话框*/public void hideLoadingDialog() {loadingDialog.dismiss();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_go:loadingDialog.show();weatherModel.getWeather(cityNOInput.getText().toString().trim(), this);break;}}@Overridepublic void onSuccess(Weather weather) {hideLoadingDialog();displayResult(weather);}@Overridepublic void onError() {hideLoadingDialog();Toast.makeText(this, 获取天气信息失败, Toast.LENGTH_SHORT).show();}private <t extends="" view=""> T findView(int id) {return (T) findViewById(id);}}

其中的接口OnWeatherListener是Module的回调,也就是上面交互图中的Module指向View的部分,通知View更新界面,这个接口可以减轻耦合度,方便单元测试Mock数据。

public interface OnWeatherListener {public void onSuccess(Weather weather);public void onError();
}

从上面代码可以看到,Activity持有了WeatherModel模型的对象,当用户有点击Button交互的时候,Activity作为Controller控制层读取View视图层EditTextView的数据,然后向Model模型发起数据请求,也就是调用WeatherModel对象的方法 getWeathre()方法。当Model模型处理数据结束后,通过接口OnWeatherListener通知View视图层数据处理完毕,View视图层该更新界面UI了。然后View视图层调用displayResult()方法更新UI。至此,整个MVC框架流程就在Activity中体现出来了。

Module层(抽象数据)

public class WeatherModelImpl implements WeatherModel {@Overridepublic void getWeather(String cityNumber, final OnWeatherListener listener) {/*数据层操作*/VolleyRequest.newInstance().newGsonRequest(http://www.weather.com.cn/data/sk/ + cityNumber + .html,Weather.class, new Response.Listener<weather>() {@Overridepublic void onResponse(Weather weather) {if (weather != null) {listener.onSuccess(weather);} else {listener.onError();}}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {listener.onError();}});}
}

Module层同样为了减轻耦合性,抽取接口WeatherModel这样可以很容易的更换Remote/Local获取数据的方式,这个接口具体如下.

public interface WeatherModel {void getWeather(String cityNumber, OnWeatherListener listener);
}
  • 以上代码看出,这里设计了一个WeatherModel模型接口,然后实现了接口WeatherModelImpl类。controller控制器activity调用WeatherModelImpl类中的方法发起网络请求,然后通过实现OnWeatherListener接口来获得网络请求的结果通知View视图层更新UI 。至此,Activity就将View视图显示和Model模型数据处理隔离开了。activity担当contronller完成了model和view之间的协调作用。

    • 至于这里为什么不直接设计成类里面的一个getWeather()方法直接请求网络数据?你考虑下这种情况:现在代码中的网络请求是使用Volley框架来实现的,如果哪天老板非要你使用Afinal框架实现网络请求,你怎么解决问题?难道是修改 getWeather()方法的实现? no no no,这样修改不仅破坏了以前的代码,而且还不利于维护, 考虑到以后代码的扩展和维护性,我们选择设计接口的方式来解决着一个问题,我们实现另外一个WeatherModelWithAfinalImpl类,继承自WeatherModel,重写里面的方法,这样不仅保留了以前的WeatherModelImpl类请求网络方式,还增加了WeatherModelWithAfinalImpl类的请求方式。Activity调用代码无需要任何修改。

看完了上面的Code,我们得出来一个结论和一个疑问。

  • 结论是分层以后显得更加清晰,为了易于维护,最好在层与层之间衔接的地方加上接口处理。这样在需要更换具体实现的时候,只需要更换实现类,而不用更改整个逻辑。
  • 疑问是从上到下没有看到View层,其实在MVC中Android系统帮我们处理了,我们可以简单的理解为XML中的UI定义,而在代码层并没有体现出View层。

附:
MVX Android设计架构浅析
MVX Android设计架构浅析-MVC
MVX Android设计架构浅析-MVP
MVX Android设计架构浅析-MVVM

MVX Android设计架构浅析-MVC相关推荐

  1. android设计架构之MVC、MVP、MVVM的理解

    引用网上的一张图来阐述Model-View-Controller,Model-View-Presenter,Model-View-ViewModel; Model-View-Controller:是我 ...

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

    本文转载自https://www.tianmaying.com/tutorial/AndroidMVC,原文作者周鸿博. 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开 ...

  3. Android Clean 架构浅析

    该原创文章首发于微信公众号"字节流动" Android 常用的架构主要有 MVC,MVP,MVVM 以及 Clean .以上架构设计模式没有绝对的优劣之分,关键要看具体的应用场景. ...

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

    转载自: http://www.tianmaying.com/tutorial/AndroidMVC 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使 ...

  5. 一种MVVM风格的Android项目架构浅析

    前几天接触公司一Android项目,刚看代码时,不知道这么多层级的代码都是干嘛的,看着有点儿懵.只有清楚了结构和流程,才能够在浩瀚的代码里游刃有余. 先不管局部是什么,从全局上去看才能把一件事情看清楚 ...

  6. Android Camera架构浅析

    原址 1.Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转 ...

  7. Android 开发架构-MVC MVP MVVM详解

    何为架构 架构,即程序的逻辑组织结构,是指导开发过程中划分程序逻辑模块的关键,好的架构要使程序达到高内聚低耦合的设计目标.例如一个人,身体的骨骼即为身体的架构,有了基本骨架之后,才可以决定在头颅里开发 ...

  8. 浅析三层架构与MVC模式的区别

    浅析三层架构与MVC模式的区别 三层架构介绍: (点击链接即可见三层架构) MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(co ...

  9. Android App架构设计

    前言 Web的架构经过多年的发展已经非常成熟了,我们常用的SSM,SSH等等,架构都非常标准.个人认为,Web服务逻辑比较清晰,目的明确,流程也相对固定,从服务器收到请求开始,经过一系列的的拦截器,过 ...

  10. Android APP架构设计——MVP的使用示例

    0. 前言 为了更好地进行移动端架构设计,我们最常用的就是MVC.MVP和MVVM,作为三个最耳熟能详的三大架构,应用可谓非常广泛.对于这三种架构设计以及优缺点已经在Android APP架构设计-- ...

最新文章

  1. C++ size_t 与 size_type区别
  2. axios请求接口http_使用axios请求接口,几种content-type的区别详解
  3. Android 监听Home键
  4. leetcode 521. 最长特殊序列 Ⅰ(Java)
  5. CCNA学习指南第十一章
  6. 【Java】JavaIO(一)、基础知识
  7. appium怎么操作物理返回键_这些Appium常用元素定位技巧,你掌握了几种?
  8. java 获取远程文件_java获取远程文件
  9. jQuery - Ajax解决跨域问题
  10. Java定时任务中间表,mysql 通过定时任务更新中间表
  11. mvc如何嵌套第三方页面_苹果屏蔽第三方Cookie,然后呢?
  12. python3 输出 26个大小写英文字母
  13. mac下chrome插件安装位置
  14. Thanos 组件介绍以及使用心得
  15. Deep Match to Rank Model for Personalized Click-Through Rate Prediction
  16. FOC——2.RC吸收电路笔记
  17. Unity集成穿山甲后打包报错android:networkSecurityConfig , Picked up JAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8
  18. 抽象代数----Sn可由两个元素生成
  19. Linux-CentOS 打造合适的科研环境
  20. 三十五岁失业的程序员,后来都干什么去了?

热门文章

  1. 安德鲁1.2Ku使用感受
  2. 电子书格式转换 Epubor Ultimate 7 附注册机
  3. 国际短信平台怎么找?
  4. 利用强化学习设计具有目标有效杨氏模量的复合材料
  5. 密码爆破 hashcat+rar2john破解rar5压缩包密码
  6. 影视之观大秦帝国之裂变总结
  7. 超实用的几款Macos/Macbook/iMac 影片剪辑软件
  8. Unity发布WebGL之后读取StreamingAssets文件路径数据
  9. 离线百度地图,添加按钮点击切换卫星地图和街道地图(纯JS)
  10. mdf文件和ldf文件是什么?