Android框架之MVP实践

作者: 人失格 | 来源:发表于2017-01-19 12:04 被阅读220次

​ Android官方早期中其实没有所谓的MVC框架,在我还是新手的时候,一个完整的Android项目其实是很混乱的,传统的MVC框架在Android上体现的不是很明显。最近在看了MVP框架自己动手写了以下发现MVP在Android中其实更像是传统的MVC。

​ MVP框架可以让UI界面和数据分离,我们的应用至少可以分为3层,这样使我们对这三层进行单独的单元测试,MVP模式可以让我们从Activity,Fragment等View角色中分离大部分代码,使得每个类型的代码量大幅度减少,职责单一,易于维护。

MVP中的三个角色

  1. Presenter 交互中间人

    Presenter主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,使得View和Model之间没有耦合,也将业务逻辑从View角色中抽离出来

  2. View-用户界面

    View通常指的Activity,Fragment,或者某个View控件,它含有一个Presenter(也可以拥有多个)成员变量。通常View需要实现一个逻辑接口,将View上的操作通过转交给Presenter进行实现,最后,Presenter调用View逻辑接口将结果返回给View元素。

  3. Model 数据的存储

    Model角色主要是提供数据的存储功能,Presenter需要通过Model层存储,获取数据,Model就像一个数据仓库,Model更想封装了数据库Dao或者网络获取数据的角色。

MVP框架的封装

在使用MVP框架中,Presenter会持有Activity的强引用,在使用中经常会出现耗时操作,我们需要将Presenter中来绑定Activity Fragment的生命周期。我们采用的是弱引用和Activity fragment的生命周期来解决你这个问题,首先我们建立一个抽象Presenter

public abstract class BasePresenter<T>{
  protected Reference<T> viewRef;
  
  public void attachView(T view){
    viewRef = new WeakReference<T>(view); 
  }
  
  protected T getView(){
    return viewRef.get();
  }
  
  public boolean isViewAttached(){
    return viewRef != null && viewRef.get();
  }
  
  public void detachView(){
    if(viewRef != null){
      viewRef.clear();
      viewRef = null;
    }
  }
}

BasePresenter 有4个方法,分别是View建立关联,解除关联,判断是否与View建立关联,获取View。View的类型通过泛型来传递,presenter持有一个View的弱引用。通常这个View的类型应该是一个实现了某个特定接口的Activity或者Fragment等类型。

public  abstract class MVPBaseActivity<V,T extends BasePresenter<V>> extends Activity{
  protected T presenter;
  
  protected void onCreate(Bundle saveInstanceState){
    super.onCreate();
    presenter = createPresenter();
    presenter.attachView((V)this);
  }
  
  protected void onDestroy(){
    super.onDestory();
    presenter.detachView();
  }
  
  protected abstract T createPresenter();
} 

MVPBaseActivity 里面有两个泛型类型,一个是View接口类型,第二个是Presenter的具体类型。通过泛型参数,将一些通用的逻辑抽象到MVPBaseActivity里面,比如我们在抽象类中将Presenter 与View的逻辑直接完成,在子类继承父类的时候只需要实现抽象方法createPresenter即可完成绑定,调用父类的super.onCreate() 完成绑定,调用父类的super.onDestory()则会解除绑定。

通过继承MVPBaseActivity,实现抽象方法来完成MVP框架,代码如下有删减。


/**
 * A login screen that offers login via email/password.
 */
public class LoginActivity extends MVPBaseActivity<ILoginView, LoginPresenter> implements ILoginView, View.OnClickListener {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        initListener();
        initToolBar();
    }

    @Override
    protected LoginPresenter createPresenter() {
        return new LoginPresenter(this);
    }


    @Override
    public void loginFail() {
        showLoading(false);
        Toast.makeText(this, "loginFail", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginSuccess(User user) {
        showLoading(false);
        Toast.makeText(this, "loginSuccess", Toast.LENGTH_SHORT).show();
        setData(user);
    }
}


相关文章

  • Android框架之MVP实践

    ​ Android官方早期中其实没有所谓的MVC框架,在我还是新手的时候,一个完整的Android项目其实是很...

  • Android MVP内存泄漏分析与动态代理

    上篇文章(Android MVP 架构MVP 之 BaseMVP 基础框架设计),我们讲到了如何封装一个 Base...

  • Android MVP框架学习实践

    五五六六七七八八 作为一名大三在读的学生,想着自己的大学生活只剩下一年了,有了些许紧迫感,于是就打算找一份实习工作...

  • Dagger2实战

    当前比较流行的Android开发框架当属MVP、RxJava、Retrofit2、Dagger2了,而在这些框架之...

  • 前端框架系列之(mvvm)

    简介 前面我们介绍过了mvc 前端框架系列之(mvc),mvp 前端框架系列之(mvp),MVP中我们说过随着业务...

  • MVP

    Google官方MVP+Dagger2架构详解【从零开始搭建android框架系列(6)】 Android MVP...

  • Mosby -- Android上的MVP框架

    Mosby 是一个用于 Android 上的 MVP 框架,可以帮助大家在 Android 上通过 MVP 模式做...

  • Retrofit2+Rxjava+MVP 实践

    此博文根据前面两篇文章 Android MVP 架构初试 Android MVP 架构封装 再结合主流框架Ret...

  • Rxandroid和MVP结合的案例

    MVP是什么 参考博客:框架模式MVP在Android中的使用在MVC框架中,View是可以直接读取Model模型...

  • MVP 笔记

    MVP 与 MVC 简单介绍 实践 参考资料:Android MVP 详解(下)一步一步实现 Android 的M...

网友评论

    本文标题:Android框架之MVP实践

    本文链接:https://www.haomeiwen.com/subject/vylibttx.html