快速搭建一个简单的T-MVP项目

使用MVP框架来开发项目已经有一段时间了,越用越觉得它好用,模块清晰,后期也利于维护,关键是,如果从代码的角度看,每个文件的代码量少了,很少像以前一样,一个activity就几千行代码(夸张)。现在记录如何快速的搭建一个相对简单的MVP项目。

先看项目结构:

这里写图片描述

上面是整个项目的包结构。因为可能涉及多人开发,所以,建包的时候,除了base,util,view(自定义view),其他包以大模块分,比如假设一个项目有俩个大的功能,登录和注册,那除了上面三个包,还有2个模块包,login,register.然后各自的模块里才是具体的mvp的子包。详细如上图结构。

在开始真正动手写业务之前,应该先把基本的mvp框架建立起来,具体体现在base里面P和V接口的创建,以及V基类的创建。具体代码如下:

MVP中V的IBaseView接口:

/**
 * Created by wjq on 2017/4/23.
 * MVP 中的接口V
 */

public interface IBaseView {
}

MVP中P的IBasePresenter接口:

/**
 * Created by wjq on 2017/4/23.
 * MVP中的BasePresenter接口P
 */

public interface IBasePresenter<T extends IBaseView> {
    /**
     * 绑定View层
     * @param view 需要实现IBaseView接口
     */
    void onViewAttached(T view);

    /**
     * 解绑View层
     */
    void onViewDetached();

    /**
     * 用于解绑Model层
     */
    void onDestory();
}

所有acitvity都要继承的BaseAcitivity:

/**
 * Created by wjq on 2017/4/23.
 * 所有Activity的基类,对于所有Activity的初始化操作进行约束
 */

public abstract class BaseAcitvity extends AppCompatActivity {

    public int layoutId;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layoutId = getlayoutId();
        setContentView(layoutId);
        initView();
        onActivityCreate(savedInstanceState);
    }

    /**
     *获得界面的资源id
     */
    protected abstract int getlayoutId();

    /**
     *初始化界面
     */
    protected abstract void initView();

    /**
     * 实现父类的onActivityCreate,完成Presenter的生成以及P和V的绑定
     * @param paramBundle
     */
    protected abstract void onActivityCreate(@Nullable Bundle paramBundle);
}

BasePresenterAcitivity这个类最关键,它对P和V进行了关联和约束,具体如下:

/**
 * Created by wjq on 2017/4/23.
 * 所有的Activity继承该Activity,实现v和p的绑定
 */

public abstract class BasePresenterAcitivity<P extends IBasePresenter<V>, V extends IBaseView> extends BaseAcitvity {
    /**
     * mPresenter是MVP中P对象,在Activity中可以使用该对象
     **/
    private P mPresenter;

    /**
     * @return 提供一个抽象的方法生成P对象,在子类中需要实现该方法
     */
    public abstract P createPresenter();

    public P getPresenter() {
        return mPresenter;
    }

    public IBaseView getPresenterView() {
        return (V) this;
    }

    @Override
    protected void onActivityCreate(@Nullable Bundle paramBundle) {
        this.mPresenter = createPresenter();
        this.mPresenter.onViewAttached((V) getPresenterView());
        onPresenterCreate(paramBundle);
    }

    @Override
    protected void onDestroy() {
        //P和V解绑
        this.mPresenter.onViewDetached();
        super.onDestroy();
    }

    /**
     * Activity的操作的入口,相当于原来的Activity的onCreate()方法
     *
     * @param paramBundle
     */
    public abstract void onPresenterCreate(@Nullable Bundle paramBundle);
}

以上P和V的接口和基类写完后,就可以开始具体业务模块mvp的搭建。对于具体模块,这里指大的模块里的具体业务,每个具体的业务,都有个契约类Contract,如这里的
LoginContract,它包含了M,V,P中所有的接口,代码如下:

/**
 * Created by wjq on 2017/4/23.
 * 在契约类里面,可以MVP各个模块的接口,对接口进行统一管理,方便,清晰
 */

public interface LoginContract {

    public interface View extends IBaseView {

    }

    public interface Presenter extends IBasePresenter<View> {

    }

    public interface Model {

    }

}

如果在Android studio 中使用MVPHelper,可以很方便的完成上面这一步。并且在相对应的包下自动生成对应的model类和presenter类,MVPHelper的使用详见MVPHelper

最后看看,具体登录业务的V LoginActivity的实现,代码如下:

/**
 * Created by wjq on 2017/4/23.
 */

public class LoginActivity extends BasePresenterAcitivity<LoginContract.Presenter,LoginContract.View> implements LoginContract.View{
    @Override
    public LoginContract.Presenter createPresenter() {
        return new LoginPresenterImpl(this);
    }

    @Override
    protected int getlayoutId() {
        return R.layout.activity_login;
    }

    @Override
    protected void initView() {

    }

    @Override
    public void onPresenterCreate(@Nullable Bundle paramBundle) {

    }
}

到这里,一个最基本的非常简单的T-MVP项目就搭建起来了,要扩展其他模块,使用其他技术也非常的方便。

猜你喜欢

转载自blog.csdn.net/u014434080/article/details/70510826