美文网首页Android自定义views android
Android标准式MVP架构模型(无内存泄漏、M层可复用)

Android标准式MVP架构模型(无内存泄漏、M层可复用)

作者: 任珉豪 | 来源:发表于2017-09-09 15:18 被阅读385次

什么是标准式?

目前大多数开发人员使用的MVP架构模型,基本都是“变种”,为的是减少开发成本,提高编码速度,比如:P层和M层合到一起,也就是“网络请求(M层)”放入到P层来做。从开发长远角度来考虑,这种方式并不理想,比如一个接口的网络请求多次使用,这个时候就要在P层多次书写,用标准式,就解决了这个问题,可以用M层来复用解决这个问题。

示例效果

MVP效果图

示例分析

主界面点击按钮,发送网络请求,请求成功之后,主界面控件更新。

MVP实现流程

标准式模型

MVP模型 MVP实现分包模型

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

可加群 136705426 跟着谷歌混饭吃

相关文章

网友评论

  • 4b01863fd657:支持一下
    任珉豪:@liuly0218 哪位大神
  • 码农一颗颗:严格意义上presenter中public BaseActivity mContext;也会出现内存泄漏吧
    任珉豪:@码农一颗颗 框架里是不会的 除非你自定义的p层 对context使用不当会造成内存泄露
  • 13itch:建议看下Android studio插件mvpplugin自动生成的代码,可以利用黑科技,省掉createpresenter这个方法
    任珉豪:@13itch 非常感谢 这个还真没了解过 我一会看看 不懂再请教你

本文标题:Android标准式MVP架构模型(无内存泄漏、M层可复用)

本文链接:https://www.haomeiwen.com/subject/rinojxtx.html