android开发:MVP基础框架设计

View 层,新建 BaseView接口:

package com.example.mvpapplication.base;

import android.content.Context;

/**
 * @Author: david.lvfujiang
 * @Date: 2019/9/16
 * @Describe:
 */
public interface BaseView{

    public Context getContext();
}

IBaseView很简单,就是获取一个上下文对象,我们在 Activity 中或多或少的用到 Context,所以就干脆写个在这里写统一了,为了避免我们在匿名内部类中要传入 MainActivity.this 这样的麻烦事

Presenter 层,新建 BasePresenter接口:

/**
 * @Author: david.lvfujiang
 * @Date: 2019/9/16
 * @Describe:
 */
public interface  BasePresenter <V extends BaseView>{
    void attachView(V view);
    void detachView();
}

IBasePresenter 做了绑定 View 和解绑 View 的操作。那我们的 BasePresenter 实现类就需要持有 BaseView 的引用

BasePresenterImpl:实现BasePresenter

这里为了防止内存泄漏使用了弱引用

public class BasePresenterImpl<V extends BaseView> implements BasePresenter<V> {
    protected Reference<V> mViewRef;

    @Override
    public void attachView(V view) {
       mViewRef = new WeakReference<>(mView);
    }

    @Override
    public void detachView() {
        mView = null;
    }
}

BaseActivity:实现BaseView

**
 * @Author: david.lvfujiang
 * @Date: 2019/9/16
 * @Describe:
 */
public abstract  class BaseActivity<T extends IBasePresenter> extends AppCompatActivity implements IBaseView {
    protected T presenter;
    protected Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter =setPresenter();
        mContext = getContext();
        initView();
        initData();
    }

    /**
     * 获取全局上下文
     * 这样子所有的子类直接使用mContext
     * @return
     */
    @Override
    public Context getContext() {
        return this;
    }

    /**
     * 提供接口给子类实现
     * @return
     */
    public abstract T setPresenter();

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

    protected abstract void initData();
}

BaseActivity去实现IBaseView,同时持有IBasePresenter接口的一个泛型对象

MainContract:我们自己的契约接口

/**
 * @Author: david.lvfujiang
 * @Date: 2019/9/16
 * @Describe:
 */
public interface MainContract {

        interface IMainView extends BaseView{
            void sendMessage();
            void succes(String content);
        }
        interface IMainPresenter
        {
            void processMessage();
        }


}

MainPresenter实现如下

**
 * @Author: david.lvfujiang
 * @Date: 2019/9/16
 * @Describe:
 */
public class MainPresenter extends BasePresenter<Contract.IMainView> implements Contract.IMainPresenter {
    @Override
    public void processMessage() {
    iView.succes("成功啦");
    }
}

MainActivity实现如下:

public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.IMainView {

  @Override
    public MainPresenter setPresenter() {
        return  new MainPresenter();
    }

  
    /**
     * 初始化view
     */
    @Override
    protected void initView() {}

    /**
     * 初始化数据
     */
    @Override
    protected void initData() {
       sendMessage();
}

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

    /**
     * 执行业务
     */
    @Override
    public void sendMessage() {
        presenter.attachView(this);
        presenter.processMessage();
  }

    /**
     * 成功回调
     *
     * @param content
     */
    @Override
    public void succes(String content) {
        Toast.makeText(mContext, content, Toast.LENGTH_SHORT).show();
        Log.e("TAG", presenter.getDate().getTime()+"");
    }
}

刚开始理解有点难度,按我的理解就是IBaseView需要定义所有view共同的方法,BaseActivity去实现这些方法,同时BaseActivity需要持有IBasePresenter的一个引用,而这个对象实例化交由BaseActivity的子类去完成,BaseActivity只提供一个抽象方法就可以。同样IBasePresenter定义Presenter所有的公共方法。BasePresenter去实现IBasePresenter中的所有方法

IBaseView和IBasePresenter是定义所有view和presenter的公共方法,Contract主要用来定义自己的业务方法。当有新的需求我们再添加一个Contract类即可。

发布了194 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39027256/article/details/100893041