我所理解的 Android MVP

2,488 阅读2分钟

     刚写完一个有关一个Android MVP模式的Demo,Demo地址在AndroidDesignPattern,记录一下MVP的使用方式,个人觉得MVC还是很好理解的。这篇文章主要记录了MVP是什么?作用是什么?MVP相对MVC的差别。最重要的是讲MVP的使用方式。

MVP与MVC

  • MVC

    M代表Model层,V代表视图层,C是控制器层,具体解释可以查看维基百科,在没有任何架构的情况下,我们的Activity作为控制器层与视图层的结合,页面逻辑简单还好,如果页面逻辑复杂,在几千行代码中找一个bug,或者版本升级,那滋味,你想想就爽啊!
    MVC

  • MVP

    MVP的出现解决了Activity或者Fragment下,控制器层与视图层之间的问题,MVP用Presenter层作为逻辑层,将逻辑层于视图层分离,通过接口的方式,让View层只做UI方面的工作,而Presenter则对数据进行处理,将View层与Model层隔离。如图:
    MVP

    MVP实现方式

    定义与UI相关的接口

         比如设置某个TextView的值,加载图片等等。代码如下:

    interface View {
        void setAvatar(String url);
        void setUserName(String name);
        void error();

    定义与数据相关的接口

         在通过网络,本地获取数据,获取数据后需要做的工作,以接口方式定义。如下:

    public interface Presenter {
      void loadGithubData(String userName);
      interface DataStatus{
        void error(Throwable varThrowable);
        void success(Users varUsers);

    实现Presenter

         实现Presenter接口,完善方法,并在方法中通过View更新数据

public class LoadGithubPresenter
    implements LoadGithubContract.Presenter, LoadGithubContract.Presenter.DataStatus {
  public static final String TAG = LoadGithubPresenter.class.getSimpleName();
  private LoadGithubContract.View mView;
  public LoadGithubPresenter(LoadGithubContract.View varView) {
    mView = varView;
    Log.d(TAG, "LoadGithubPresenter: 初始化Presenter");
   public void loadGithubData(String userName) {
    Subscription s = GitHubApi.getContributors(userName)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::success, this::error);
   public void error( Throwable var) {
    Log.d(TAG, "error: "+var.getMessage());
    mView.error();
   public void success(Users varUsers) {
    mView.setUserName(varUsers.login);
    mView.setAvatar(varUsers.avatar_url);

在Activity中使用

    在Activity中实现View,并且初始化,调用数据加载函数。ok,等着见证最后的结果:

public class MvpActivity extends AppCompatActivity implements LoadGithubContract.View {
   public static final String TAG = MvpActivity.class.getSimpleName();
   private SimpleDraweeView mSimpleDraweeView;
   private TextView mTextView;
   private LoadGithubContract.Presenter mPresenter;
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_mvp);
     mSimpleDraweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
     mTextView = (TextView) findViewById(R.id.my_name_view);
     mPresenter = new LoadGithubPresenter(MvpActivity.this);
    protected void onResume() {
     super.onResume();
     mPresenter.loadGithubData("jiangTaoQuite");
    public void setAvatar(String url) {
     mSimpleDraweeView.setImageURI(url);
    public void setUserName(String name) {
     mTextView.setText(name);
    public void error() {
     Toast.makeText(this,"获取数据错误",Toast.LENGTH_LONG).show();