基类(BaseActivity)设计开发谈

前言

android开发过程中,我用得比较多的是mvp架构,然而在代码不断优化的过程中,出现了系列问题,主要冲突在于:我需要在具备mvp架构的同时,能兼容下一个Activity的基类,毕竟一个BaseActivity在一个项目中具备重要作用。那么今天就来讲讲mvp架构BaseActivity之间的冲突问题吧

今天涉及以下内容:

  1. mvp架构简单介绍
  2. mvp架构下添加BaseActivity猜想
    2.1 希望的需求
    2.2 继承扩展猜想
    2.3 代理模式增强猜想
    2.4 抽象接口猜想
  3. 最后的话

一.mvp架构简单介绍

mvp架构基于顶层接口设计,则会具备以下两个接口类:

/**
 *   MVP-View基类
 */
public interface PreView {

}

以及

/**
 * Created by Admin on 2017/5/16.
 *
 * T-MVP Presenter基类
 */

public interface PrePresenter {

    void attachView();

    void detachView();

}

然后基于以上两个接口类写一个Contract,以MainContract为例,代码如下:

public class MainContract {

    public interface View extends PreView {

        void loginSuccess(SaleOrganizationInfo soInfo);
        void loginFail(String msg);

    }

    public interface Presenter extends PrePresenter {
        //登录
        void postLogin(String userName, String passWord, String type);
    }

}

接着对以前写过的一个Activity基类要做一个简单的处理,如下:

public abstract class AppActivity2 extends SuperActivity {

    protected T mPresenter;

    @Override
    public void loadMVP() {
        super.loadMVP();

        mPresenter = getPresenter();
        if (mPresenter != null) {
            mPresenter.attachView();
        }
    }

    @Override
    protected void onDestroy() {
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        super.onDestroy();
    }

    public abstract T getPresenter();

}

然后实现Presenter接口,写一个MainPresenter

public class MainPresenter implements MainContract.Presenter{

    private Context mContext;
    private MainContract.View mView;

    public MainPresenter(Context context, PreView view) {
        this.mContext = context;
        this.mView = (MainContract.View) view;

    }


    @Override
    public void attachView() {//可以用来注册RxBus

    }

    @Override
    public void detachView() {//可以用来注销RxBus

    }

    @Override
    public void postLogin(String userName, String passWord) {
        TreeMap map = new TreeMap();
        map.put("username", userName);// 用户名
        map.put("password", passWord);// 密码

        ApiService apiService = (ApiService) ApiRetrofitor.getInstance().getBaseRetrofitor().getApiService();
        //发起请求
        Observable observable = apiService.postLogin(map);
        LoadingDialog.getInstance().showLoading(mContext);

        RxManager.connect(observable, new ApiObserver>() {
            @Override
            public void doNext(ResponseData responseData) {
                LoadingDialog.getInstance().hideLoading();

                int code = responseData.getCode();
                String message = responseData.getMessage();

                switch (code) {
                    case ResponseCode.SUCCES_CODE://成功
                        SaleOrganizationInfo soInfo = responseData.getData();
                        mView.loginSuccess(soInfo);
                        break;
                    default://失败
                        mView.loginFail(message);
                        break;
                }
            }

            @Override
            public void doError(ServerException e) {
                LoadingDialog.getInstance().hideLoading();

                mView.loginFail(e.getMessage());
            }
        });
    }
}

最后在Activity中作如下使用:

public class SocketActivity2 extends AppActivity2implements MainContract.View {

    @Override
    public int getContentViewId() {
        return R.layout.activity_main;
    }

    @Override
    public MainPresenter getPresenter() {
        return null;
    }

    @Override
    public void initData() {

    }

    @Override
    public void setListener() {

    }

    @Override
    public void loginSuccess(SaleOrganizationInfo soInfo) {

    }

    @Override
    public void loginFail(String msg) {

    }
}

二.mvp架构下添加BaseActivity猜想

2.1 希望的需求

在以上讲的mvp模式下,我们希望做到的是在不改变以上代码的前提下,对Activity基类增强。

2.2 继承扩展猜想

最直接的想法无非是继承AppActivity2再写一个基类,然后在基类中作扩展,类似如下:

你可能感兴趣的:(基类(BaseActivity)设计开发谈)