Android MVP 简单学习
Android MVP 初学笔记
Android MVP 初学笔记 前言 简介 Model View Presenter 示例 用户交互 View接口 Activity类实现View接口 事务管理 Presenter类 Activity类实例化Presenter类 数据请求 DataManager类 总结
前言
经过了几天的学习 做一个记录(so easy)
希望日后回头来看自己笔记的时候还能想起相关内容
简介
MVP(Model View Presenter) 应属于一种应用体系架构,使结构更分离,代码更清晰,开发更有效率。
这张图画得很清楚
Model
数据层
本地文件数据(例如SharedPreferences) 本地数据库数据(例如SQLite数据库) 网络数据
View
UI层
界面、控件、视图等
Activity、Fragment、ViewGroup等
Presenter
事物层
处理Model层的数据,View层的交互之间的逻辑
示例
用户交互
例如一个
Activity类,应用需要将数据展现给用户
(这里有两个自定义交互 1、显示网络图片 2、跳转界面)
那么在这个类中实现View接口中定义的方法
View接口
View接口
interface MyView extends BaseView {
void onSuccess();
void onError(String s);
/**
* 显示网络图片
*/
void setImage(RequestCreator creator);
/**
* 页面跳转
*/
void transition(Intent intent);
}
RequestCreator是Picasso图片加载库中用到的一个类
Activity类实现View接口
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类
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类
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();
}
...
}
现在梳理一下过程:
是不是没毛病
数据请求
数据请求
Presenter类中使用
DataManager来获取了数据,根据开头的结构图来看,
DataManager属于Model层
之前说道数据的请求并不是由它来完成的,那么先看
DataManager怎么拿的数据
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),还有很多问题将与之结合(比如线程等)解决。
下一篇: 我的网站被降权 到底做错了什么?