注意点:
- IView和IModel是顶层接口,接口中没有任何方法,用于多态。
- SingleInterfaceContract中View和Presenter接口以及ISingleInterfaceModel三个接口定义了MVP三层需要实现用于对方调用的方法。
- V层的基类BaseMVPActivity持有P层的对象,该对象在实现类中初始化,V层需要获取数据只要调用该对象2中对应的方法即可。
- P层的基类BasePresenter持有V层的对象,该对象在V层调用attach方法的时候初始化,P层需要返回数据只要调用该对象2中对应的方法即可。
- P层的实现类SingleInterfacePresenter持有M层的对象,该对象在P层实现类构造函数初始化,在V层需要获取数据后,P层调用该对象2中对应的方法并把返回的数据返回给V层。
- 对于上述三个主要接口,V层和M层接口用于P层调用,P层接口用于V层调用。
先从Model层说起,IModel和IView是顶层接口,只是一个空接口,用作中间层泛型使用:
IModel:
public interface IModel {
}
IView:
public interface IView {
}
蓝色的中间层接口定义了MVP三层相互调用的接口
MultipleInterfaceContract:
public interface MultipleInterfaceContract {
interface View extends IView {
String presenterGetDataFromView();
}
interface Presenter {
String viewGetDataFromPresenter(int viewDataIndex);
}
}
ISingleInterfaceModel
public interface ISingleInterfaceModel extends IModel {
String sendDataFromModelToPresenter(String dataIndex);
}
三层的中间层接口对应的方法全都有最底层的实现类实现
SingleInterfaceActivity
public class SingleInterfaceActivity extends BaseMVPActivity<SingleInterfacePresenter> implements SingleInterfaceContract.View {
private Button button;
private TextView textView;
@Override
protected SingleInterfacePresenter createPresenter() {
Log.d("MvpDemo", "createPresenter");
return new SingleInterfacePresenter();
}
@Override
protected void init() {
setContentView(R.layout.activity_single_interface);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText(mPresenter.sendDataFromPresenterToView());
}
});
}
@Override
public String presenterGetDataFromView() {
return "book";
}
}
SingleInterfacePresenter
public class SingleInterfacePresenter extends SingleBasePresenter<SingleInterfaceContract.View> implements SingleInterfaceContract.Presenter{
private final SingleInterfaceModel singleInterfaceModel;
public SingleInterfacePresenter() {
this.singleInterfaceModel = new SingleInterfaceModel();
}
@Override
public String sendDataFromPresenterToView() {
String dataIndex = mView.presenterGetDataFromView();
return singleInterfaceModel.sendDataFromModelToPresenter(dataIndex);
}
}
SingleInterfaceModel
public class SingleInterfaceModel implements ISingleInterfaceModel{
Map<String, String> hashMap = new HashMap(){
{
put("book", "this is book in model.");
put("pen", "this is pen in model");
put("desk", "this is desk in model");
}
};
@Override
public String sendDataFromModelToPresenter(String dataIndex) {
return hashMap.get(dataIndex);
}
}
接下来再介绍中间层,中间层主要作用是建立MVP三层之间的联系,由于V和P层相互持有对方对象,而P和M层之间只有P层单方向持有M层对象,因此M层不需要中间层。
BaseMVPActivity
public abstract class BaseMVPActivity<T extends IPresenter> extends AppCompatActivity implements IView {
protected T mPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initPresenter();
init();
}
protected void initPresenter() {
mPresenter = createPresenter();
if (mPresenter != null) {
mPresenter.attachView(this);
}
}
@Override
protected void onDestroy() {
if (mPresenter != null) {
mPresenter.detachView();
}
super.onDestroy();
}
protected abstract T createPresenter();
protected abstract void init();
}
SingleBasePresenter
public abstract class SingleBasePresenter<T extends IView> implements IPresenter<T> {
protected T mView;
@Override
public void attachView(T view) {
Log.d("MvpDemo", "attachView");
if (view == null) {
Log.d("MvpDemo", "mView is null");
}
mView = view;
}
@Override
public void detachView() {
mView = null;
}
@Override
public boolean isViewAttached() {
return mView != null;
}
}
V和P层都在中间层持有了对方的对象,其中V层通过在实现类中新建P层对象,同时调用P层的attach方法建立双向连接,因此P层需要对应的绑定相关接口来供V层调用,也就是IPresenter
IPresenter
public interface IPresenter<T extends IView> {
void attachView(T view);
void detachView();
boolean isViewAttached();
}