Android MVP架构 完整封装实例

本文参考了MVP学习,作了补充与部分修改
针对MVP概念的讲解不再多说,有意者可以查看以下链接进行学习
Android MVP 架构设计实现 深度解耦
本文将常用的MVP模板进行了封装,可以直接使用。


项目文件一览
项目文件一览

mvp文件夹下的内容皆为封装好的类,可以不改动。main文件夹下的内容为自己项目所需要实现的。


以下为代码
MvpView-View的基础类

public interface MvpView {
}

MvpPresenter-Presenter的基础类,控制的MvpView的子类

public interface MvpPresenter<V extends MvpView> {

    void attachView(V view);

    void detachView();

}

BasePresenter-用于保持对View的引用

public abstract class BasePresenter<V extends MvpView> implements MvpPresenter<V> {
    private WeakReference<V> reference;


    @Override
    public void attachView(V view) {
        if (view == null)
            throw new NullPointerException("view can not be null when in attachview() in BasePresenter");
        else {
            if (reference == null)
                reference = new WeakReference<>(view);//将View置为弱引用,当view被销毁回收时,依赖于view的对象(即Presenter)也会被回收,而不会造成内存泄漏

        }

    }

    @Override
    public void detachView() {

        if (reference != null) {
            reference.clear();
            reference = null;
        }
    }

    public V getMvpView() {
        if (isAttach())
            return reference.get();
        else
            throw new NullPointerException("have you ever called attachView() in BasePresenter");
    }

    public boolean isAttach() {
        return reference != null && reference.get() != null;
    }
}

BaseDelegateCallback-用于对获取MvpView、创建以及获取presenter

public interface BaseDelegateCallback<P extends MvpPresenter, V extends MvpView> {

    void setPresenter();

    P getPresenter();

    P createPresenter();

    V getMvpView();

}

MvpInternalDelegate-用于控制MvpPresenter与MvpView

public class MvpInternalDelegate<P extends MvpPresenter, V extends MvpView> {
    BaseDelegateCallback<P, V> callback;

    public MvpInternalDelegate(BaseDelegateCallback<P, V> callback) {
        this.callback = callback;
    }


    public P createPresenter() {
        P p = callback.getPresenter();
        if (p == null)
            p = callback.createPresenter();
        if (p == null)
            throw new NullPointerException("callback.createPresenter() is null in MvpInternalDelegate");
        return p;
    }

    public void attachView() {
        callback.getPresenter().attachView(callback.getMvpView());
    }

    public void detachView() {
        callback.getPresenter().detachView();
    }
}

接下来分别是Activity与Fragment的封装

  • Activity

1 .创建一个ActyvityDelegate,与activity生命周期一致,目的是为了通过activity的生命周期去控制是否要attachView:

public interface ActivityDelegate {
     void onCreate();

     void onPause();

     void onResume();

     void onStop();

     void onDestroy();
}

2 .ActivityMvpDelegateCallback-生命周期回调

public interface ActivityMvpDelegateCallback<P extends MvpPresenter, V extends MvpView>
        extends BaseDelegateCallback<P, V> {

}

3 .创建一个ActivityDelegateImp,实现了ActivityDelegate,在生命周期里控制presenter与MvpView

public class ActivityDelegateImp<P extends MvpPresenter, V extends MvpView> implements ActivityDelegate {
    private BaseDelegateCallback<P, V> basemvpDelegateCallback;
    private MvpInternalDelegate<P, V> mvpInternalDelegate;

    //传入BaseDelegateCallback 去控制Presenter
    public ActivityDelegateImp(BaseDelegateCallback<P, V> basemvpDelegateCallback) {
        if (basemvpDelegateCallback == null)
            throw new NullPointerException("the basemvpDelegateCallback in ActivityDelegateImpn is null");
        this.basemvpDelegateCallback = basemvpDelegateCallback;
        mvpInternalDelegate = new MvpInternalDelegate<>(this.basemvpDelegateCallback);

    }

    @Override
    public void onCreate() {
        mvpInternalDelegate.createPresenter();
        mvpInternalDelegate.attachView();

    }

    @Override
    public void onPause() {

    }

    @Override
    public void onResume() {

    }

    @Override
    public void onStop() {

    }

    @Override
    public void onDestroy() {
        mvpInternalDelegate.detachView();
    }
}

4 .创建一个基类Activity,这是一个抽象类,所有使用Mvp的Activity可以继承此类

public abstract class BaseMvpActivity<P extends MvpPresenter, V extends MvpView> extends AppCompatActivity implements
        ActivityMvpDelegateCallback<P, V>, MvpView {
    private ActivityDelegate mActivityDelegate;
    private P mPresenter;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mActivityDelegate = new ActivityDelegateImp<>(this);
        mActivityDelegate.onCreate();

        setContentView(getLayoutResId());


        init();


    }

    @Override
    protected void onResume() {
        super.onResume();
        mActivityDelegate.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mActivityDelegate.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mActivityDelegate.onStop();
    }


    @Override
    public void setPresenter() {

    }

    //暴露一个创建的方法用于创建presenter
    protected abstract P CreatePresenter();

    @Override
    //这个方法由MvpInternalDelegate 调用 BaseDelegateCallback 来创建Presenter
    public P createPresenter()

    {
        mPresenter = CreatePresenter();
        return mPresenter;
    }

    @Override
    public P getPresenter() {
        return mPresenter;
    }

    @Override
    public V getMvpView() {
        return (V) this;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        mActivityDelegate.onDestroy();

    }
    //初始化
    protected abstract void init();

    //用于获取布局id
    protected abstract int getLayoutResId();

}
  • Fragment 与Activity类似
    1 . FragmentDelegate -Fragment的生命周期接口
public interface FragmentDelegate {
    void onCreateView();

    void onPause();

    void onResume();

    void onStop();

    void onDestroyView();
}

2 .FragmentMvpDelegateCallback-Fragment的生命周期回调

public interface FragmentMvpDelegateCallback<P extends MvpPresenter, V extends MvpView>
        extends BaseDelegateCallback<P, V> {

}

3 .FragmentDelegateImp-实现了FragmentDelegate,在生命周期里控制Presenter与MvpView:当Fragment执行到各个生命周期时,这里会执行对应的生命周期

public class FragmentDelegateImp<P extends MvpPresenter, V extends MvpView> implements FragmentDelegate {
    private BaseDelegateCallback<P, V> basemvpDelegateCallback;
    private MvpInternalDelegate<P, V> mvpInternalDelegate;

    //传入BaseDelegateCallback 去控制Presenter
    public FragmentDelegateImp(BaseDelegateCallback<P, V> basemvpDelegateCallback) {
        if (basemvpDelegateCallback == null)
            throw new NullPointerException("the basemvpDelegateCallback in FragmentDelegate is null");
        this.basemvpDelegateCallback = basemvpDelegateCallback;
        mvpInternalDelegate = new MvpInternalDelegate<>(this.basemvpDelegateCallback);

    }



    @Override
    public void onCreateView() {
        mvpInternalDelegate.createPresenter();
        mvpInternalDelegate.attachView();
    }

    @Override
    public void onPause() {

    }

    @Override
    public void onResume() {

    }

    @Override
    public void onStop() {

    }

    @Override
    public void onDestroyView() {
        mvpInternalDelegate.detachView();
    }
}

4.创建一个基础Fragment,这是个抽象类,作为所有使用Mvp的Fragment的公共父类

public abstract class BaseMvpFragment<P extends MvpPresenter, V extends MvpView> extends Fragment implements
        FragmentMvpDelegateCallback<P, V>, MvpView {
    private FragmentDelegate mFragmentDelegate;
    private P mPresenter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mFragmentDelegate = new FragmentDelegateImp<>(this);
        mFragmentDelegate.onCreateView();

        View view = inflater.inflate(getLayoutResId(), container, false);
        init();

        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        mFragmentDelegate.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        mFragmentDelegate.onResume();
    }

    @Override
    public void onStop() {
        super.onStop();
        mFragmentDelegate.onStop();
    }

    protected abstract void init();

    protected abstract int getLayoutResId();

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mFragmentDelegate.onDestroyView();
    }

    @Override
    public void setPresenter() {

    }

    //暴露一个创建的方法用于创建presenter
    protected abstract P CreatePresenter();

    @Override
    //这个方法由MvpInternalDelegate 调用BaseDelegateCallback 来创建presenter
    public P createPresenter() {
        mPresenter = CreatePresenter();
        return mPresenter;
    }

    @Override
    public P getPresenter() {
        return mPresenter;
    }

    @Override
    public V getMvpView() {
        return (V) this;
    }
}

至此,封装已完成接下来是使用介绍

这里只介绍了Activity如何使用,Fragment与此类似,可直接是=使用之前封装的框架

1 .MainContract -主界面的Presenter和View的契约类,Google推荐使用此类
这里是将MainActivity所有的View操作与逻辑操作在接口中进行声明,便于查看

public class MainContract {
    public interface IMainView extends MvpView {
        //将一些操作界面的方法在这里声明
        void method1();

        void method2();

    }

    public interface IMainPresenter extends MvpPresenter<IMainView> {
        //将一些逻辑处理的方法在此声明
        void init();

        void doSomeThing1();

        void doSomeThing2();
    }

    //这是Model的数据获取接口
    public interface onGetData {
        void onSucc(String data);

        void onFail(String error);
    }

2 .MainActivity -主界面,继承BaseMvpActivity并实现IMainView 里的所有方法

public class MainActivity extends BaseMvpActivity<MainPresenter, MainContract.IMainView> implements MainContract.IMainView {
    private MainPresenter presenter;

    @Override
    protected MainPresenter CreatePresenter() {
        return new MainPresenter();
    }

    @Override
    protected void init() {
        //在这里进行控件ID的获取以及初始化
        presenter = getPresenter();
        presenter.init();

    }

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_main;
    }


    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }


}

3 .MainModel-主界面里数据的获取(数据库中获取或者联网请求在此实现将结果通过接口回调)

public class MainModel {
    private MainContract.onGetData listener;

    public void setListener(MainContract.onGetData listener) {
        this.listener = listener;
    }

    public void getData() {
        String response = "response";
        String error = "error";
        //执行数据获取的逻辑
        listener.onSucc(response);
        listener.onFail(error);
    }
}

4 .MainPresenter -MainActivity的逻辑处理在此进行,通过接口接收Model回传的数据

public class MainPresenter extends BasePresenter<MainContract.IMainView> implements MainContract.IMainPresenter, MainContract.onGetData {
    private MainContract.IMainView view;
    private MainModel model=new Model();

    @Override
    public void init() {
        view = getMvpView();
        model.setListener(this);
    }

    @Override
    public void doSomeThing1() {

    }

    @Override
    public void doSomeThing2() {

    }

    @Override
    public void onSucc(String data) {
        //执行对界面的操作
        view.method1();
    }

    @Override
    public void onFail(String error) {
        //执行对界面的操作
        view.method2();
    }
}

至此,代码已经全部完成。
附上源码下载地址
GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值