前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搭建一个MVP框架

搭建一个MVP框架

作者头像
饮水思源为名
发布2018-09-06 12:54:26
1K0
发布2018-09-06 12:54:26
举报
文章被收录于专栏:Android小菜鸡

什么是MVP:

  MVP是一种设计模式,是MVC模式的一种演变。他出现的主要目的是划分代码模块职责,降低模块耦合度,易于单元测试。

  • view层:负责UI绘制以及用户交互。
  • presenter层:负责协调model和view层以及义务逻辑处理。
  • model层:负责数据的检索,持久化等操作。

1.png

为什么要使用MVP:

  • 划分代码模块职责,降低模块耦合度
  • 一个大项目,一个人完成需要一年。利用MVP让12个人一个月可以完成,并且在编码中,每个人可以专注于属于自己的那一部分。
  • 思路清晰,也让接手的人更易理解。
  • 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。

如何快速搭建一个MVP的框架:

  这里我们以一个数据请求demo为例。需求是利用mvp构建,从网络获取数据,以列表的形式显示出来。

View包(掌管的是UI和用户交互):

  1. 创建接口 IActivity。首先,得有一个渲染ListView的方式,参数是adapter;然后,我们得考虑如果数据没有成功获取或者获取到的数据为空时,得渲染出相应页面,所以得有两个方法一个渲染空数据页面,一个提示数据获取失败。最后,我们得定义一个方法去开启/结束在加载数据时的Loading动画。
  2. 创建类 Activity 实现IActivity接口。首先我们需要定义一个ListView以及实现一个Adapter用于展示内容。然后,利用接口实现Persenter即可。严格来说还需要创建一个ViewHolder用于Adapter,因为是UI代码,所以尽量写在Veiw层。

Persenter包(处理view层和model层的交互):

  1. 创建接口IPersenter。因为我们这里只有数据获取并展示一个需求,所以只需要定义一个请求数据的方法即可。
  2. 创建类Persenter实现IPersenter接口。在构造参数中,至少得获取IActivity。用于调用UI渲染的各种方法。需要实例化Hander以及Model,并且将Hander作为参数传入Model中。
  3. 创建类Hander。Hander用于处理在Model中获取到的内容。然后反馈给View渲染UI。需要实例化Persenter。利用Persenter获取Model中的数据内容以及IActivity中的渲染方法。
  4. 创建类Adapter。用于构建数据内容适配。展示在UI上。

Model包(处理数据请求操作):

  1. 创建接口IModel。需要定义一个网络请求的方法以及一个数据解析的方法。
  2. 创建类Model。在构造函数中需要传入参数Hander以及需求参数。在数据请求结束后通过Hander发送出去。

封装Base:

  每次都按照上述方式去搭建MVP架构在初期开发时一件很麻烦的事情,我们希望能够简化我们的搭建操作,统一管理并且解决Presenter容易引起的内容溢出的问题(弱应用);

BaseMVPActivity:

代码语言:javascript
复制
package com.wusy.wusylibrary.base;
import android.os.Bundle;
import android.support.annotation.Nullable;

/**
 * Created by XIAO RONG on 2018/3/23.
 */

public abstract class BaseMVPActivity <V extends IBaseMVPView, T extends BaseMVPPresenter<V>>
        extends BaseActivity{
    public T mPresenter;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        mPresenter = createPresenter();
        mPresenter.attachView((V)this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        if (mPresenter != null){
            mPresenter.detachView();
        }
        super.onDestroy();
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (mPresenter == null){
            mPresenter = createPresenter();
        }
    }

    /**
     * 创建Presenter对象
     * @return Presenter对象
     */
    protected abstract T createPresenter();

    public T getmPresenter() {
        return mPresenter;
    }
}

BaseMVPPresenter:

代码语言:javascript
复制
package com.wusy.wusylibrary.base;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;

/**
 * Created by XIAO RONG on 2018/3/23.
 */

public class BaseMVPPresenter <T extends IBaseMVPView>{
    /**
     * View接口类型的弱引用
     */
    private Reference<T> mViewRef;

    protected T mMvpView;

    /**
     * 建立关联
     */
    public void attachView(T view){
        mViewRef = new WeakReference<>(view);
        if(isViewAttached()) {
            mMvpView = getView();
        }
    }

    /**
     * 获取View
     * @return View
     */
    public T getView(){
        if (mViewRef != null) {
            return mViewRef.get();
        }
        return null;
    }

    /**
     * UI展示相关的操作需要判断一下 Activity 是否已经 finish.
     * <p>
     * todo : 只有当 isActivityAlive 返回true时才可以执行与Activity相关的操作,
     * 比如 弹出Dialog、Window、跳转Activity等操作.
     *
     * @return boolean
     */
    public boolean isViewAttached(){
        return mViewRef != null && mViewRef.get() != null;
    }

    /**
     * 解除关联
     */
    public void detachView(){
        if( mViewRef != null){
            mViewRef.clear();
            mViewRef = null;
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是MVP:
  • 为什么要使用MVP:
  • 如何快速搭建一个MVP的框架:
    • View包(掌管的是UI和用户交互):
      • Persenter包(处理view层和model层的交互):
        • Model包(处理数据请求操作):
        • 封装Base:
          • BaseMVPActivity:
            • BaseMVPPresenter:
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档