Android MVP架构

原创 2016年05月29日 00:15:32

MVP架构简介

MVP模式是由著名的MVC模式演变过来的,Android应用开发本身就是MVC模式,其中xml的布局是View层,Activity就相当于Controller。然而实际开发过程中,Activity经常不能纯粹的充当Controller,因为既要负责渲染view,又要处理业务逻辑,所以经常看到一个Activity有上千行代码,代码臃肿难懂,维护起来也非常吃力。这时候就需要简化Activity的职责,让它只负责界面的绘制和渲染,再抽出一层来负责处理业务逻辑,这就演变出了MVP模式。


MVP模式分为三层:Model层, View层,Presenter层。

View层:也就是视图层,负责展示数据,以及用户与界面的交互,提供良好的用户体验,View层一般是Activity或者Fragment。

Model层: 数据处理层,为用户界面提供基本的数据支持,例如数据库的增删改查,网络操作。

Presenter层:它是连接view 层和model层的中间层,处理业务逻辑。它从Model层获取数据,处理之后交给view层显示。

关于MVP模式,Google官方也给出了一些架构的实现。源码地址:https://github.com/googlesamples/android-architecture. 


实例分析

我自己写了一个简单的Demo用来加深印象,此demo是模拟从服务器load天气数据,然后在对数据进行处理,最终显示在界面上,主要是用来说明三个层之间的关系,并没有实现具体的代码。目录结构如下:

首先Model层,对应的是WeatherDataSource,一个单例的类,是对网络请求的封装,代码如下:

public class WeatherDataSource {

    private static final int MSG_LOAD_CHINA_DATA = 1;
    private static final int MSG_LOAD_GLOBAL_DATA = 2;
    private static WeatherDataSource sWeatherDataSource;
    private Context mContext;

    private MyHandler mHandler = null;

    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_LOAD_CHINA_DATA:
                    doLoadChinaData((ILoadWeatherDataListener)msg.obj);
                    break;
                case MSG_LOAD_GLOBAL_DATA:
                    break;
            }
        }
    }

    private WeatherDataSource(Context context) {
        mContext = context;
        //创建一个工作线程,用于从网络load数据
        HandlerThread handlerThead = new HandlerThread("work thread");
        mHandler = new MyHandler(handlerThead.getLooper());
        handlerThead.start();
    }

    public static synchronized WeatherDataSource getInstance(Context context) {
        if(sWeatherDataSource == null) {
            sWeatherDataSource = new WeatherDataSource(context);
        }
        return sWeatherDataSource;
    }

    /**
     * 从中央气象局接口load数据
     * @param listener
     */
    public void loadChinaData(ILoadWeatherDataListener listener){

        if(mHandler != null) {
            mHandler.sendMessage(mHandler.obtainMessage(MSG_LOAD_CHINA_DATA, listener));
        }
    }

    private void doLoadChinaData(ILoadWeatherDataListener listener) {
        //load data...
    }

    public interface ILoadWeatherDataListener {
        void onLoadSuccess(String data);
        void onLoadFailed();
    }

}

其中,在构造方法中,创建了一个HandlerThread,用于异步请求网络数据,请求回来之后,通过ILoadWeatherDataListener回调做相应操作。

Presenter层与View层提供的接口,定义了View层,以及Presenter层对外提供哪些接口,代码如下,

public interface LoadWeatherData {

    public interface BaseView {
        public void showData(String data);
    }

    public interface BasePresenter {
        public String loadChinaData();
    }
}
其中,View层提供显示数据的接口,而Presenter提供查询数据的接口。

Presenter层,对应的是LoadDataPresenter类,代码如下,

public class LoadDataPresenter implements WeatherDataSource.ILoadWeatherDataListener{

    private Context mContext;
    private LoadWeatherData.BaseView mBaseView;

    @Override
    public void onLoadFailed() {
        mBaseView.showData(null);
    }

    @Override
    public void onLoadSuccess(String data) {
        mBaseView.showData(data);
    }

    public LoadDataPresenter(Context context, LoadWeatherData.BaseView baseView) {
        mContext = context;
        mBaseView = baseView;
    }

    public void loadChinaWeatherData() {
        WeatherDataSource.getInstance(mContext).loadChinaData(this);
    }
}
此类实现了ILoadWeatherDataListener接口,并且依赖view层,当load成功或者失败之后,调用View层的showData方法。


View层,对应的就是MainActivity,代码如下:

public class MainActivity extends Activity implements LoadWeatherData.BaseView {

    private static final String TAG = "MainActivity";

    private LoadDataPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPresenter = new LoadDataPresenter(this,this);

        mPresenter.loadChinaWeatherData();

    }

    @Override
    public void showData(String data) {
        if(data != null) {
            Log.d(TAG, "----showData-----" + data);
        } else {
            Log.d(TAG, "----showData-----data is null" );
        }

    }
}
在onCreate方法里,初始化LoadDataPresenter,并且调用loadChinaWeatherData方法,而且实现了showData方法,来显示数据。一般情况下View层都会与用户交互,下拉刷新之类的操作,不同的操作调用Presenter相应的接口。

以上就是整个Demo的简单说明。

总之,使用MVP架构可以使代码层级之间的结构更加单一清晰,从而让我们的项目更好维护和扩展。

Android架构(一)MVP架构在Android中的实践

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/54783106 本文出自:【余志强的博客】 为什...
  • johnny901114
  • johnny901114
  • 2017年01月30日 16:05
  • 5350

Android官方MVP架构解读

对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的。而对于Android应用的开发中本身可视为一种MVC架构。通常...
  • ljd2038
  • ljd2038
  • 2016年05月22日 22:24
  • 40301

Android开发之MVP架构详解

Android开发之MVP架构详解 一、MVP和MVC的一点感悟   MVP模式估计每个人都了解一点,是从MVC演变而来,随着项目的逐渐变大考虑到产品的维护以及扩展性,MVC的短处逐渐暴露出来,从...
  • u010456903
  • u010456903
  • 2016年12月02日 23:42
  • 1869

Android mvp 架构的自述

最近发现再也无法忍受越来越臃肿的Activity代码,越来越来混乱的Activity层的代码,投入到了MVP的怀抱。目前来看MVP的架构还是很适合Android的,在这里记录一下一点心得,希望都给想用...
  • DanteStones
  • DanteStones
  • 2016年03月17日 17:51
  • 6562

android MVP——mvp架构的应用和优化

MVP架构在android还是很好用的。我也在试着将mvp用在项目中。下面我就来说说mvp模式的应用和优化。mvp模式的概念MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Contr...
  • yehui928186846
  • yehui928186846
  • 2016年05月27日 20:06
  • 4123

Android MVP架构学习(附demo)

本篇关于MVP架构的学习是在查阅了很多资料整理出来。网上一些关于Android MVP的介绍都有点浅尝辄止,一个登录或者根据地区查询天气等的小Demo,没有实际在项目中应用的示例,所以在用MVP做完一...
  • qq_33748378
  • qq_33748378
  • 2016年08月12日 14:58
  • 2804

一个Android项目搞定所有主流架构-MVP+单元测试

一个Android项目搞定所有主流架构-1.项目介绍和基本MVC架构示例 一个Android项目搞定所有主流架构-2.MVP+单元测试...
  • syc434432458
  • syc434432458
  • 2016年10月08日 09:22
  • 1148

Android MVP架构解析

1. 为什么会有 MVP 架构?1.1 MVC在此,我先介绍下,MVC架构,毕竟MVP也是从MVC演化过来的 MVC:1.View:对应于布局文件 2.Model:业务逻辑和实体模型 3.Contr...
  • u011033906
  • u011033906
  • 2017年02月20日 21:25
  • 284

Android Mvp架构设计与性能优化

Android Mvp架构设计与性能优化 什么是mvp架构设计? MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。   模型(Mode...
  • LiuRenyou
  • LiuRenyou
  • 2017年05月27日 22:26
  • 578

Android应用架构之Android MVP使用

前两篇已经将Retrofit和RxAndroid应用到了项目中,这篇本打算直接将Dagger2引进项目,但是考虑到整个项目结构,就来个结构整理吧,一起来看看网上炒得火热MVP模式。 说到MVP就不得不...
  • liuhongwei123888
  • liuhongwei123888
  • 2015年12月22日 16:33
  • 8772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android MVP架构
举报原因:
原因补充:

(最多只允许输入30个字)