View 层,新建 BaseView接口:
package com.example.mvpapplication.base;
import android.content.Context;
/**
* @Author: david.lvfujiang
* @Date: 2019/9/16
* @Describe:
*/
public interface BaseView{
public Context getContext();
}
IBaseView很简单,就是获取一个上下文对象,我们在 Activity 中或多或少的用到 Context,所以就干脆写个在这里写统一了,为了避免我们在匿名内部类中要传入 MainActivity.this 这样的麻烦事
Presenter 层,新建 BasePresenter接口:
/**
* @Author: david.lvfujiang
* @Date: 2019/9/16
* @Describe:
*/
public interface BasePresenter <V extends BaseView>{
void attachView(V view);
void detachView();
}
IBasePresenter 做了绑定 View 和解绑 View 的操作。那我们的 BasePresenter 实现类就需要持有 BaseView 的引用
BasePresenterImpl:实现BasePresenter
这里为了防止内存泄漏使用了弱引用
public class BasePresenterImpl<V extends BaseView> implements BasePresenter<V> {
protected Reference<V> mViewRef;
@Override
public void attachView(V view) {
mViewRef = new WeakReference<>(mView);
}
@Override
public void detachView() {
mView = null;
}
}
BaseActivity:实现BaseView
**
* @Author: david.lvfujiang
* @Date: 2019/9/16
* @Describe:
*/
public abstract class BaseActivity<T extends IBasePresenter> extends AppCompatActivity implements IBaseView {
protected T presenter;
protected Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter =setPresenter();
mContext = getContext();
initView();
initData();
}
/**
* 获取全局上下文
* 这样子所有的子类直接使用mContext
* @return
*/
@Override
public Context getContext() {
return this;
}
/**
* 提供接口给子类实现
* @return
*/
public abstract T setPresenter();
/**
* 初始化View
*/
protected abstract void initView();
protected abstract void initData();
}
BaseActivity去实现IBaseView,同时持有IBasePresenter接口的一个泛型对象
MainContract:我们自己的契约接口
/**
* @Author: david.lvfujiang
* @Date: 2019/9/16
* @Describe:
*/
public interface MainContract {
interface IMainView extends BaseView{
void sendMessage();
void succes(String content);
}
interface IMainPresenter
{
void processMessage();
}
}
MainPresenter实现如下
**
* @Author: david.lvfujiang
* @Date: 2019/9/16
* @Describe:
*/
public class MainPresenter extends BasePresenter<Contract.IMainView> implements Contract.IMainPresenter {
@Override
public void processMessage() {
iView.succes("成功啦");
}
}
MainActivity实现如下:
public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.IMainView {
@Override
public MainPresenter setPresenter() {
return new MainPresenter();
}
/**
* 初始化view
*/
@Override
protected void initView() {}
/**
* 初始化数据
*/
@Override
protected void initData() {
sendMessage();
}
@Override
protected int getActivityLayoutID() {
return R.layout.activity_main;
}
/**
* 执行业务
*/
@Override
public void sendMessage() {
presenter.attachView(this);
presenter.processMessage();
}
/**
* 成功回调
*
* @param content
*/
@Override
public void succes(String content) {
Toast.makeText(mContext, content, Toast.LENGTH_SHORT).show();
Log.e("TAG", presenter.getDate().getTime()+"");
}
}
刚开始理解有点难度,按我的理解就是IBaseView需要定义所有view共同的方法,BaseActivity去实现这些方法,同时BaseActivity需要持有IBasePresenter的一个引用,而这个对象实例化交由BaseActivity的子类去完成,BaseActivity只提供一个抽象方法就可以。同样IBasePresenter定义Presenter所有的公共方法。BasePresenter去实现IBasePresenter中的所有方法
IBaseView和IBasePresenter是定义所有view和presenter的公共方法,Contract主要用来定义自己的业务方法。当有新的需求我们再添加一个Contract类即可。