Android Mvp架构详解

注意点:

  1. IView和IModel是顶层接口,接口中没有任何方法,用于多态。
  2. SingleInterfaceContract中View和Presenter接口以及ISingleInterfaceModel三个接口定义了MVP三层需要实现用于对方调用的方法。
  3. V层的基类BaseMVPActivity持有P层的对象,该对象在实现类中初始化,V层需要获取数据只要调用该对象2中对应的方法即可。
  4. P层的基类BasePresenter持有V层的对象,该对象在V层调用attach方法的时候初始化,P层需要返回数据只要调用该对象2中对应的方法即可。
  5. P层的实现类SingleInterfacePresenter持有M层的对象,该对象在P层实现类构造函数初始化,在V层需要获取数据后,P层调用该对象2中对应的方法并把返回的数据返回给V层。
  6. 对于上述三个主要接口,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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值