Android:MVP模式

来源:互联网 发布:shake it off动作数据 编辑:程序博客网 时间:2024/05/17 22:53

Android MVP分析:

1、MVP:

  • M-model,即javaBean 数据模型层;
  • V-view,视图层,常用的即Activity Fragment,这里是定义一个接口IView,Activity去实现IView的写法;
  • P-presenter,数据处理层,所有的数据逻辑,业务逻辑都在这里处理;
2、目录:


3、分析:

首先先看model文件:

public class StudentInfo {    private String name;    private String age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }}
这里包含了一个对象的基本信息。


接着api文件,里面放的是api接口。更能直接明了的看到View和Presenter之间的方法。

先看看两个基类:

IBaseAPI:

/** * Created by GR on 2017/2/27. * 功能:设置当前主体 */public interface IBaseAPI<T> {     void setPresenter(T presenter);}
IBasePresenter:

/** * Created by GR on 2017/2/27. * 功能:约定了所有Presenter的初始化操作都放在start()方法中 */public interface IBasePresenter {    void start();}

IStudentInfo:

public interface IStudentInfo {    //对UI进行操作    interface IView extends IBaseAPI<IPresenter>{        void showDialog();  //显示窗口        void closeDialog(); //关闭窗口        String studentName();//假设获取学生名字        void call(StudentInfo studentInfo);//获取学生信息后回调    }    //对数据的业务逻辑进行操作    interface IPresenter extends IBasePresenter{        void loadStudentInfo();    }}

内部有2个接口,分别继承了IBaseAPI和IBasePresenter,IView和IPresenter中实现的方法分别是UI操作,和数据业务逻辑操作.


接下来看业务逻辑的具体操作:

StudentPresenter:

public class StudentPresenter implements IStudentInfo.IPresenter {    private IStudentInfo.IView mIview;    public StudentPresenter(IStudentInfo.IView iview) {        mIview = iview;        mIview.setPresenter(this);//这里设置当前主体类    }    @Override    public void start() {        loadStudentInfo();    }    @Override    public void loadStudentInfo() {        final String name = mIview.studentName();//从外部获取学生信息名字        mIview.showDialog();//显示加载页面        //模仿网络请求         new Handler().postDelayed(new Runnable() {            @Override            public void run() {                StudentInfo studentInfo = new StudentInfo();//创建学生信息                studentInfo.setName(name);                studentInfo.setAge("18岁");                mIview.call(studentInfo);//获取到学生信息之后回调                mIview.closeDialog();//关闭弹窗            }        },2000);//延时2秒后进行    }}

1)构造函数中传入IStudentInfo.IView,并且调用IBaseAPI的setPresenter()方法;
2)将所有的初始化操作都放在start()方法中(这里demo只有一个:网络请求获取用户信息),这样只要进入界面的时候调用start()方法就可以执行一系列初始化的操作,这就相当于一种约定好的开发。


最后看一下Activity界面:

public class StudentMainActivity extends AppCompatActivity        implements IStudentInfo.IView {    private IStudentInfo.IPresenter mPresenter;    private ProgressDialog mDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        new StudentPresenter(this);        mPresenter.start();//这里直接调用start()方法,是因为在new StudentPresenter(this)中,activity已经回调过setPresenter方法,对mPresenter进行了初始化。    }    @Override    public void showDialog() {        mDialog = new ProgressDialog(this);        mDialog.setMessage("正在加载...");        mDialog.show();    }    @Override    public void closeDialog() {        mDialog.dismiss();        Toast.makeText(this, "加载完成", Toast.LENGTH_LONG).show();    }    @Override    public String studentName() {        return "小三,嘎嘎";    }    @Override    public void call(StudentInfo studentInfo) {        if (null != studentInfo) {            Toast.makeText(this, "姓名:" + studentInfo.getName() + "\n年龄:"                    + studentInfo.getAge(), Toast.LENGTH_LONG).show();        }    }    @Override    public void setPresenter(IStudentInfo.IPresenter presenter) {        mPresenter = presenter;    }}
ok,mvp理解到这儿,自己做个小记录。


最后附上几张测试图片:


0 0
原创粉丝点击