当前位置: 移动技术网 > IT编程>移动开发>Android > Android MVP 简单学习

Android MVP 简单学习

2018年01月28日  | 移动技术网IT编程  | 我要评论

天灾杀手,台湾黄姓小模,小镇百人患尘肺病

Android MVP 初学笔记

Android MVP 初学笔记 前言 简介 Model View Presenter 示例 用户交互 View接口 Activity类实现View接口 事务管理 Presenter类 Activity类实例化Presenter类 数据请求 DataManager类 总结

前言

经过了几天的学习 做一个记录(so easy)

希望日后回头来看自己笔记的时候还能想起相关内容

简介

MVP(Model View Presenter) 应属于一种应用体系架构,使结构更分离,代码更清晰,开发更有效率。

集成MVP

这张图画得很清楚

Model

数据层

本地文件数据(例如SharedPreferences) 本地数据库数据(例如SQLite数据库) 网络数据

View

UI层

界面、控件、视图等

Activity、Fragment、ViewGroup等

Presenter

事物层

处理Model层的数据,View层的交互之间的逻辑

示例

用户交互

例如一个Activity类,应用需要将数据展现给用户

(这里有两个自定义交互 1、显示网络图片 2、跳转界面)

那么在这个类中实现View接口中定义的方法

View接口

interface MyView extends BaseView {

  void onSuccess();

  void onError(String s);

  /**
   * 显示网络图片
   */
  void setImage(RequestCreator creator);

  /**
   * 页面跳转
   */
  void transition(Intent intent);
}

RequestCreator是Picasso图片加载库中用到的一个类

Activity类实现View接口

public class MyActivity extends AppCompatActivity implements MyView{
    ...
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError(String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void setImage(RequestCreator creator) {
        creator.into(helloIv);
    }

    @Override
    public void transition(Intent intent) {
        this.startActivity(intent);
    }
    ...      
}

creator.into(helloIv)意为将“请求到的图片”设置到(ImageView)helloIv中去(Picasso)

这些自定义方法什么时候调用,以及数据(例如请求的图片)是如何传过来的

则由Presenter层处理

事务管理

BasePresenter一般会定义一些与Activity生命周期相关的方法(例如onCreate()、onStart()等)

还有一个attachView()方法,参数为View层的接口,这个方法用于和View捆绑、并且调用它的方法

从而实现对UI的管理

BasePresenter

public interface BasePresenter {

void onCreate();

...

void attachView(BaseView view);
}

Presenter类

public class MyPresenter implements BasePresenter {

  private DataManager manager;

  private Context mContext;

  private MyView mView;

  public MyPresenter(Context context) {

    mContext=context;

  }

  @Override
  public void onCreate() {

    manager=new DataManager(mContext);

  }

  @Override
  public void onStart() {

    getImage();

  }

  ...

  @Override
  public void attachView(BaseView view) {

    mView=(MyView) view;

  }

  /**
   * 设置图片
   */
  public void getImage() {

    String imgUrl=manager.getUrl();

    if(imgUrl==null){

      mView.onError(ERROR_IMAGE);

    } else {

      mView.onSuccess();

      mView.setImage(
        Picasso.with(mContext)
        .load(imgUrl)//加载图片网络链接
        .placeholder(R.drawable.img_hello)//加载时的内容
        .error(R.drawable.img_hello)//加载错误时的内容
        .fit()//图片方式(填满)
      );

    }
  }
}

这里没有放 “界面跳转的代码” 进来,只举例了 “图片的设置”

(实际数据的请求更加复杂)

DataManager会在下文进行解释

可以看到MyPresenter实现了BasePresenter的方法,并且可以添加自定义方法(例如getImage())

其中包括数据的获取以及View中方法的调用,实际上数据的请求是由DataManager(Model层)完成的(更具体的说DataManager只是对请求到的数据进行了一个预处理,请求过程并不是它做的)

onCreate()中初始化了DataManager 在onStart()中调用了getImage() (其他自定义事务管理)

Activity类实例化Presenter类

这时事务已经安排好了,只需在Acitivity里将其实例化并且调用即可

这样BasePresenter中的方法与Activity的方法(例如onCreate()就可以很好的“相亲相爱”了)

public class MyActivity extends AppCompatActivity implements MyView{

  MyPresenter mPresenter;

  ImageView helloIv;

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

    helloIv=findViewById(R.id.iv_helloimg);

    mPresenter = new MyPresenter(this);

    mPresenter.onCreate();

    mPresenter.attachView(this);//绑定View

    //TODO
  }

  @Override
  protected void onStart() {
    super.onStart();
    mPresenter.onStart();
  }

  ...

}

现在梳理一下过程:

Created with Rapha?l 2.1.2Activity开始实例化Presenter实例化DataManager绑定ViewActivity.onStart()获取图片设置图片显示图片

是不是没毛病

数据请求

Presenter类中使用DataManager来获取了数据,根据开头的结构图来看,DataManager属于Model

之前说道数据的请求并不是由它来完成的,那么先看DataManager怎么拿的数据

DataManager类

public class DataManager {

  private Context mContext;

  private RetrofitHelper mRetrofitHelper;

  public DataManager(Context context){
    mContext=context;
    mRetrofitHelper = RetrofitHelper.getInstance(context);
  }

  public String getUrl(){
    return getImage().getUrl();
  }

  public HelloImage getImage(){
    return mRetrofitHelper.getImage("Andriod","640");
  }
}

HelloImage是一个自定义实体类,根据接口返回的数据生成(包含URL属性)

这里的RetrofitHelper是一个自定义类,用于请求服务器接口

使用了Retrofit 2 网络请求库,

(实际用法并不是代码中那样,这里简化仅用于说明)

getUrl()方法返回了从接口返回的图形信息类HelloImage中的Url属性值

关于接口请求,笔者使用的只是众多方法中的一个,所以接口请求类就不多说,各取所需

总结

Android MVP 使整个业务的逻辑看起来很清晰

UI交互、UI与数据的逻辑事务、数据管理、数据请求

框架把这些分的清清楚楚,写得愉快,维护的也开心

这篇记录只是简单描述了MVP模式,其中很多逻辑并不能应用到实际中(比如请求图片URL之后由Picasso再请求那个URL),还有很多问题将与之结合(比如线程等)解决。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网