本文参考了MVP学习,作了补充与部分修改
针对MVP概念的讲解不再多说,有意者可以查看以下链接进行学习
Android MVP 架构设计实现 深度解耦
本文将常用的MVP模板进行了封装,可以直接使用。
项目文件一览
mvp文件夹下的内容皆为封装好的类,可以不改动。main文件夹下的内容为自己项目所需要实现的。
以下为代码
MvpView-View的基础类
public interface MvpView {
}
MvpPresenter-Presenter的基础类,控制的MvpView的子类
public interface MvpPresenter<V extends MvpView> {
void attachView(V view);
void detachView();
}
BasePresenter-用于保持对View的引用
public abstract class BasePresenter<V extends MvpView> implements MvpPresenter<V> {
private WeakReference<V> reference;
@Override
public void attachView(V view) {
if (view == null)
throw new NullPointerException("view can not be null when in attachview() in BasePresenter");
else {
if (reference == null)
reference = new WeakReference<>(view);//将View置为弱引用,当view被销毁回收时,依赖于view的对象(即Presenter)也会被回收,而不会造成内存泄漏
}
}
@Override
public void detachView() {
if (reference != null) {
reference.clear();
reference = null;
}
}
public V getMvpView() {
if (isAttach())
return reference.get();
else
throw new NullPointerException("have you ever called attachView() in BasePresenter");
}
public boolean isAttach() {
return reference != null && reference.get() != null;
}
}
BaseDelegateCallback-用于对获取MvpView、创建以及获取presenter
public interface BaseDelegateCallback<P extends MvpPresenter, V extends MvpView> {
void setPresenter();
P getPresenter();
P createPresenter();
V getMvpView();
}
MvpInternalDelegate-用于控制MvpPresenter与MvpView
public class MvpInternalDelegate<P extends MvpPresenter, V extends MvpView> {
BaseDelegateCallback<P, V> callback;
public MvpInternalDelegate(BaseDelegateCallback<P, V> callback) {
this.callback = callback;
}
public P createPresenter() {
P p = callback.getPresenter();
if (p == null)
p = callback.createPresenter();
if (p == null)
throw new NullPointerException("callback.createPresenter() is null in MvpInternalDelegate");
return p;
}
public void attachView() {
callback.getPresenter().attachView(callback.getMvpView());
}
public void detachView() {
callback.getPresenter().detachView();
}
}
接下来分别是Activity与Fragment的封装
- Activity
1 .创建一个ActyvityDelegate,与activity生命周期一致,目的是为了通过activity的生命周期去控制是否要attachView:
public interface ActivityDelegate {
void onCreate();
void onPause();
void onResume();
void onStop();
void onDestroy();
}
2 .ActivityMvpDelegateCallback-生命周期回调
public interface ActivityMvpDelegateCallback<P extends MvpPresenter, V extends MvpView>
extends BaseDelegateCallback<P, V> {
}
3 .创建一个ActivityDelegateImp,实现了ActivityDelegate,在生命周期里控制presenter与MvpView
public class ActivityDelegateImp<P extends MvpPresenter, V extends MvpView> implements ActivityDelegate {
private BaseDelegateCallback<P, V> basemvpDelegateCallback;
private MvpInternalDelegate<P, V> mvpInternalDelegate;
//传入BaseDelegateCallback 去控制Presenter
public ActivityDelegateImp(BaseDelegateCallback<P, V> basemvpDelegateCallback) {
if (basemvpDelegateCallback == null)
throw new NullPointerException("the basemvpDelegateCallback in ActivityDelegateImpn is null");
this.basemvpDelegateCallback = basemvpDelegateCallback;
mvpInternalDelegate = new MvpInternalDelegate<>(this.basemvpDelegateCallback);
}
@Override
public void onCreate() {
mvpInternalDelegate.createPresenter();
mvpInternalDelegate.attachView();
}
@Override
public void onPause() {
}
@Override
public void onResume() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
mvpInternalDelegate.detachView();
}
}
4 .创建一个基类Activity,这是一个抽象类,所有使用Mvp的Activity可以继承此类
public abstract class BaseMvpActivity<P extends MvpPresenter, V extends MvpView> extends AppCompatActivity implements
ActivityMvpDelegateCallback<P, V>, MvpView {
private ActivityDelegate mActivityDelegate;
private P mPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivityDelegate = new ActivityDelegateImp<>(this);
mActivityDelegate.onCreate();
setContentView(getLayoutResId());
init();
}
@Override
protected void onResume() {
super.onResume();
mActivityDelegate.onResume();
}
@Override
protected void onPause() {
super.onPause();
mActivityDelegate.onPause();
}
@Override
protected void onStop() {
super.onStop();
mActivityDelegate.onStop();
}
@Override
public void setPresenter() {
}
//暴露一个创建的方法用于创建presenter
protected abstract P CreatePresenter();
@Override
//这个方法由MvpInternalDelegate 调用 BaseDelegateCallback 来创建Presenter
public P createPresenter()
{
mPresenter = CreatePresenter();
return mPresenter;
}
@Override
public P getPresenter() {
return mPresenter;
}
@Override
public V getMvpView() {
return (V) this;
}
@Override
protected void onDestroy() {
super.onDestroy();
mActivityDelegate.onDestroy();
}
//初始化
protected abstract void init();
//用于获取布局id
protected abstract int getLayoutResId();
}
- Fragment 与Activity类似
1 . FragmentDelegate -Fragment的生命周期接口
public interface FragmentDelegate {
void onCreateView();
void onPause();
void onResume();
void onStop();
void onDestroyView();
}
2 .FragmentMvpDelegateCallback-Fragment的生命周期回调
public interface FragmentMvpDelegateCallback<P extends MvpPresenter, V extends MvpView>
extends BaseDelegateCallback<P, V> {
}
3 .FragmentDelegateImp-实现了FragmentDelegate,在生命周期里控制Presenter与MvpView:当Fragment执行到各个生命周期时,这里会执行对应的生命周期
public class FragmentDelegateImp<P extends MvpPresenter, V extends MvpView> implements FragmentDelegate {
private BaseDelegateCallback<P, V> basemvpDelegateCallback;
private MvpInternalDelegate<P, V> mvpInternalDelegate;
//传入BaseDelegateCallback 去控制Presenter
public FragmentDelegateImp(BaseDelegateCallback<P, V> basemvpDelegateCallback) {
if (basemvpDelegateCallback == null)
throw new NullPointerException("the basemvpDelegateCallback in FragmentDelegate is null");
this.basemvpDelegateCallback = basemvpDelegateCallback;
mvpInternalDelegate = new MvpInternalDelegate<>(this.basemvpDelegateCallback);
}
@Override
public void onCreateView() {
mvpInternalDelegate.createPresenter();
mvpInternalDelegate.attachView();
}
@Override
public void onPause() {
}
@Override
public void onResume() {
}
@Override
public void onStop() {
}
@Override
public void onDestroyView() {
mvpInternalDelegate.detachView();
}
}
4.创建一个基础Fragment,这是个抽象类,作为所有使用Mvp的Fragment的公共父类
public abstract class BaseMvpFragment<P extends MvpPresenter, V extends MvpView> extends Fragment implements
FragmentMvpDelegateCallback<P, V>, MvpView {
private FragmentDelegate mFragmentDelegate;
private P mPresenter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mFragmentDelegate = new FragmentDelegateImp<>(this);
mFragmentDelegate.onCreateView();
View view = inflater.inflate(getLayoutResId(), container, false);
init();
return view;
}
@Override
public void onPause() {
super.onPause();
mFragmentDelegate.onPause();
}
@Override
public void onResume() {
super.onResume();
mFragmentDelegate.onResume();
}
@Override
public void onStop() {
super.onStop();
mFragmentDelegate.onStop();
}
protected abstract void init();
protected abstract int getLayoutResId();
@Override
public void onDestroyView() {
super.onDestroyView();
mFragmentDelegate.onDestroyView();
}
@Override
public void setPresenter() {
}
//暴露一个创建的方法用于创建presenter
protected abstract P CreatePresenter();
@Override
//这个方法由MvpInternalDelegate 调用BaseDelegateCallback 来创建presenter
public P createPresenter() {
mPresenter = CreatePresenter();
return mPresenter;
}
@Override
public P getPresenter() {
return mPresenter;
}
@Override
public V getMvpView() {
return (V) this;
}
}
至此,封装已完成接下来是使用介绍
这里只介绍了Activity如何使用,Fragment与此类似,可直接是=使用之前封装的框架
1 .MainContract -主界面的Presenter和View的契约类,Google推荐使用此类
这里是将MainActivity所有的View操作与逻辑操作在接口中进行声明,便于查看
public class MainContract {
public interface IMainView extends MvpView {
//将一些操作界面的方法在这里声明
void method1();
void method2();
}
public interface IMainPresenter extends MvpPresenter<IMainView> {
//将一些逻辑处理的方法在此声明
void init();
void doSomeThing1();
void doSomeThing2();
}
//这是Model的数据获取接口
public interface onGetData {
void onSucc(String data);
void onFail(String error);
}
2 .MainActivity -主界面,继承BaseMvpActivity并实现IMainView 里的所有方法
public class MainActivity extends BaseMvpActivity<MainPresenter, MainContract.IMainView> implements MainContract.IMainView {
private MainPresenter presenter;
@Override
protected MainPresenter CreatePresenter() {
return new MainPresenter();
}
@Override
protected void init() {
//在这里进行控件ID的获取以及初始化
presenter = getPresenter();
presenter.init();
}
@Override
protected int getLayoutResId() {
return R.layout.activity_main;
}
@Override
public void method1() {
}
@Override
public void method2() {
}
}
3 .MainModel-主界面里数据的获取(数据库中获取或者联网请求在此实现将结果通过接口回调)
public class MainModel {
private MainContract.onGetData listener;
public void setListener(MainContract.onGetData listener) {
this.listener = listener;
}
public void getData() {
String response = "response";
String error = "error";
//执行数据获取的逻辑
listener.onSucc(response);
listener.onFail(error);
}
}
4 .MainPresenter -MainActivity的逻辑处理在此进行,通过接口接收Model回传的数据
public class MainPresenter extends BasePresenter<MainContract.IMainView> implements MainContract.IMainPresenter, MainContract.onGetData {
private MainContract.IMainView view;
private MainModel model=new Model();
@Override
public void init() {
view = getMvpView();
model.setListener(this);
}
@Override
public void doSomeThing1() {
}
@Override
public void doSomeThing2() {
}
@Override
public void onSucc(String data) {
//执行对界面的操作
view.method1();
}
@Override
public void onFail(String error) {
//执行对界面的操作
view.method2();
}
}
至此,代码已经全部完成。
附上源码下载地址
GitHub