什么是开发模式?
以一种简单明了的方式去开发程序
什么是mvp,有一个叫做mvc的不行吗
model(模型) view(视图) presenter(主持)
mvc—>>model(模型) view(视图) control(控制)
android最原始的开发(将逻辑写进activity里面),然后一个实体类(数据层)
其实这就是mvc了
但是,activity既当爹又当妈的就是说即使v层也是c层
到最后,改功能的时候,你会发现一件事,what?代码怎么这么多,如果你还记得你写的方法或者什么叫撒名,你可以用ctrl+f去查找。
所以,mvp出来了。presenter就来替activity分担
现在activity只负责视图显示了,视图想要撒,跟p说,p拿到请求后对m说:“给我xxxxx”。m就给了p xxxx。
然后p将xxxx给了v,v最后更新ui给用户显示
看图!
可以看到m甚至可以对v做出操作然后
相互之间独立,对开发解耦,也为后期维护保证了便利性
不多说了看看代码
1. 结构
分别的文件夹对应相应的层,同时,我们某一层对另一层的请求,一般为接口,对接口方法的复写
2. layout布局
这里简单点,就一个button请求对textview进行替换
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="mvp demo"
android:textSize="18sp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="替换" />
</LinearLayout>
只有一个布局,别想多了
3. 接着逻辑
button请求,textview替换,那么接口就这样
IModel.java
public interface IModel {
void change(OnFinishListener listener);
}
Model.java实现
public class Model implements IModel {
@Override
public void change(OnFinishListener listener) {
listener.successful("替换成功");
}
}
就是得到请求后返回数据,这里有一个listener,这是什么?这一般拿来给model返回数据用,不可能将void
改成String
或者其他的来直接返回给presenter吧,那presenter会乱糟透的,当然你可以试试
接着看看listener的代码
public interface OnFinishListener {
void successful(String text);
void failed(String error);
}
ok,listener既然是个接口给谁用呢,谁调用m层呢?没错presenter
IPresenter.java
public interface IPresenter {
void change();
}
Presenter.java
public class Presenter implements IPresenter,OnFinishListener {
@Override
public void change() {
}
@Override
public void successful(String text) {
}
@Override
public void failed(String error) {
}
}
首先先实现两个接口的方法,接着完善,既然v层,请求p层,那么change()
就是方法了,但是谁给的presenter呢?就要在构造方法里告诉了
public class Presenter implements IPresenter,OnFinishListener {
private IModel mIModel;
private IView mIView;
public Presenter(IView IView) {
mIView = IView;
mIModel = new Model();
}
@Override
public void change() {
mIModel.change(this);
}
@Override
public void successful(String text) {
mIView.setTv(text);
}
…………………
}
ok,p层也完了,接下来,v层。
这里我们想一下,v要干嘛?
不错,显示textview,那么我们把显示tv的操作拿出来,放进接口里(IView.java)
public interface IView {
void setTv(String tv);
}
emmmmmm,看看有疏漏的么
set传入参数,设置参数值,恩没错、
看实现类
public class MVPAvtivity extends AppCompatActivity implements IView {
private TextView mTextView;
private IPresenter mIPresenter;//接口变量,建议不要用Presenter
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
mIPresenter = new Presenter(this);//presenter实例化
mTextView = findViewById(R.id.tv);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mIPresenter.change();//调用变量的方法,总会有某个人去实现它
}
});
}
@Override
public void setTv(String tv) {
mTextView.setText(tv);//设置tv
}
}
相信自己,能读懂它
我相信这样一件事,在以后你会发现,每次改动功能,那么p层也会相应的改动,十之八九你会直接改动Presenter.java,只需要限定符为public
就万事大吉,并且P层的接口类都可以不用了。
但是,当你这么做的时候,你每次在某个地方调用P层的方法时,你可能会这样:
- presenter. 然后在idea弹出的方法里去找(p层是自己写的话可能也一样)
- 在java文件里一行一行的读,找到自己的方法
- My god listener的方法怎么都在,撞邪了?没有,方法就是public
既然这样你为撒不写在接口里面方便又快捷,一行一个方法,看着都舒服
4. 都操作完了,我们来运行一下
emmmm gradle.build…………
如有什么疑问,请提出
如有什么不足,请指出
谢谢!
最后安利一个mvp高级封装
http://blog.csdn.net/yulong0809/article/details/78622428?ref=myread