![](https://img.haomeiwen.com/i6641707/21fd3659af512283.jpeg)
什么是标准式?
目前大多数开发人员使用的MVP架构模型,基本都是“变种”,为的是减少开发成本,提高编码速度,比如:P层和M层合到一起,也就是“网络请求(M层)”放入到P层来做。从开发长远角度来考虑,这种方式并不理想,比如一个接口的网络请求多次使用,这个时候就要在P层多次书写,用标准式,就解决了这个问题,可以用M层来复用解决这个问题。
示例效果
![](https://img.haomeiwen.com/i6641707/2b629d1b9cb63a2a.gif)
示例分析
主界面点击按钮,发送网络请求,请求成功之后,主界面控件更新。
MVP实现流程
标准式模型
![](https://img.haomeiwen.com/i6641707/49e92970decb2915.png)
![](https://img.haomeiwen.com/i6641707/3cc868366f63d226.png)
V层的实现
1、界面要继承写好的BaseActivity,并传入一个回调接口,及一个自定义P层,继承之后会实现一个创建P层的抽象方法。
public class MainActivity extends BaseActivity<ITestActivity,TestPresenter> implements ITestActivity
@Override
protected TestPresenter createPresenter() {
return new TestPresenter(this);
}
2、定义V层接口,这个接口的作用就是通过P层传输数据到V层
public interface ITestActivity {
void setString(String s);
}
P层的实现
1、P层要继承写好的BasePresenter,并传入V层接口。
public class TestPresenter extends BasePresenter<ITestActivity>
2、在构造方法中实例化M层
public TestPresenter(ITestActivity context) {
super(context);
this.testModel = new TestModel();
}
M层的实现
1、定义个方法,实现网络请求
public class TestModel {
public void getData(final int i, final ITestModel callBack) {
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(1500);
if (i > 2) {
callBack.success("请求成功");
} else {
callBack.error();
}
}
}).start();
}
}
2、定义个回调接口,实现M层数据回调到P层
public interface ITestModel {
void success(String s);
void error();
}
业务逻辑实现
点击发送网络请求:调用P层方法
tvOnclick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.getData(5);
}
});
P层调用M层
public void getData(int i) {
testModel.getData(i, new ITestModel() {
@Override
public void success(String s) {
getView().setString(s);
}
@Override
public void error() {
}
});
}
P层收到M层回调的数据,通过V层接口传输数据更新界面
getView().setString(s);
MVP底层框架实现
BaseActivity
public abstract class BaseActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
if (mPresenter != null) {
mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
mPresenter.onCreate();
}
}
//用于创建Presenter和判断是否使用MVP模式(由子类实现)
protected abstract T createPresenter();
//生命周期
@Override
public void onStart() {
super.onStart();
if (mPresenter != null) {
mPresenter.onStart();
}
}
@Override
public void onResume() {
super.onResume();
if (mPresenter != null) {
mPresenter.onResume();
}
}
@Override
public void onPause() {
super.onPause();
if (mPresenter != null) {
mPresenter.onPause();
}
}
@Override
public void onStop() {
super.onStop();
if (mPresenter != null) {
mPresenter.onStop();
}
}
@Override
public void onDestroy() {
if (mPresenter != null) {
mPresenter.detachView();
mPresenter.onDestroy();
}
super.onDestroy();
}
}
在onCreate方法中声明一个抽象方法,让实现类去实现,去创建自己的P层。
同时activity的声命周期与presenter的生命周期进行绑定,为后续业务逻辑服务。
同时在onCreate方法调用P层的mPresenter.attachView方法。
BasePresenter
public class BasePresenter<V>{
public BaseActivity mContext;
public BasePresenter(BaseActivity context) {
mContext = context;
}
protected Reference<V> mViewRef;
public void attachView(V view) {
mViewRef = new WeakReference<V>(view);
}
public void detachView() {
if (mViewRef != null) {
mViewRef.clear();
mViewRef = null;
}
}
public V getView() {
return mViewRef != null ? mViewRef.get() : null;
}
//生命周期回调
public void onCreate() {
}
public void onStart() {
}
public void onResume() {
}
public void onPause() {
}
public void onStop() {
}
public void onDestroy() {
}
}
这里的attachView方法的作用就是把对V层的引用转化成弱引用,防止内存泄漏,getView的方法即可使用传入的V层的接口函数。
疑难问题解答
1、P层如何使用Context,由于BasePresenter 有个mContext的成员变量,可直接使用mContext。
2、P层如何调用V层的方法,getVIew获得V层的接口,让V层实现该接口并实现该方法即可。
该项目特点
1、无内存泄漏
2、使用方便
3、M层可复用
4、标准式MVP架构
如何使用该MVP框架
1、Gradle引入
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
ependencies {
compile 'com.github.xinyangcuncun:AndroidGodMvp:V1.0.0'
}
2、源码导入
github 地址(源码+demo): https://github.com/xinyangcuncun/AndroidGodMvp
网友评论