MVP是一种设计模式,是MVC模式的一种演变。他出现的主要目的是划分代码模块职责,降低模块耦合度,易于单元测试。
1.png
这里我们以一个数据请求demo为例。需求是利用mvp构建,从网络获取数据,以列表的形式显示出来。
每次都按照上述方式去搭建MVP架构在初期开发时一件很麻烦的事情,我们希望能够简化我们的搭建操作,统一管理并且解决Presenter容易引起的内容溢出的问题(弱应用);
package com.wusy.wusylibrary.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
/**
* Created by XIAO RONG on 2018/3/23.
*/
public abstract class BaseMVPActivity <V extends IBaseMVPView, T extends BaseMVPPresenter<V>>
extends BaseActivity{
public T mPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = createPresenter();
mPresenter.attachView((V)this);
super.onCreate(savedInstanceState);
}
@Override
public void onDestroy() {
if (mPresenter != null){
mPresenter.detachView();
}
super.onDestroy();
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (mPresenter == null){
mPresenter = createPresenter();
}
}
/**
* 创建Presenter对象
* @return Presenter对象
*/
protected abstract T createPresenter();
public T getmPresenter() {
return mPresenter;
}
}
package com.wusy.wusylibrary.base;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
/**
* Created by XIAO RONG on 2018/3/23.
*/
public class BaseMVPPresenter <T extends IBaseMVPView>{
/**
* View接口类型的弱引用
*/
private Reference<T> mViewRef;
protected T mMvpView;
/**
* 建立关联
*/
public void attachView(T view){
mViewRef = new WeakReference<>(view);
if(isViewAttached()) {
mMvpView = getView();
}
}
/**
* 获取View
* @return View
*/
public T getView(){
if (mViewRef != null) {
return mViewRef.get();
}
return null;
}
/**
* UI展示相关的操作需要判断一下 Activity 是否已经 finish.
* <p>
* todo : 只有当 isActivityAlive 返回true时才可以执行与Activity相关的操作,
* 比如 弹出Dialog、Window、跳转Activity等操作.
*
* @return boolean
*/
public boolean isViewAttached(){
return mViewRef != null && mViewRef.get() != null;
}
/**
* 解除关联
*/
public void detachView(){
if( mViewRef != null){
mViewRef.clear();
mViewRef = null;
}
}
}