MVP 封装抽取

当我们的逻辑功能越来越多,每个功能点都要写一套MVP,是一件很繁琐的事情。因此我们要对MVP的进行封装和抽取。
View 视图层 有activity Fragment view 来代表,UI层面的有时候也会有一些共性问题,比如都是展示成功数据,展示失败数据,展示加载中,加载异常等等。所以针对View 抽取一个接口baseView。
Presenter 中间层 是View Model之间交互的桥梁。Presenter是个中间对象,所以他的抽取只是对View Model的抽取。但是Model没有什么共性特点,业务的处理不一样。所以就剩下View的特点,咱们在初始化P的会传入view的引用,这个view 有可能是Activity或者fragment,所以就要考虑生命周期导致的内存泄漏问题,要及时清除对象之间的依赖关系。
Model 业务逻辑 模型层 负责耗时任务处理,单纯的处理数据。

需要回顾MVP 请参考:https://blog.csdn.net/chentaishan/article/details/105265331

1.基类的封装

public interface IBaseView {
    void error(String error);
}


public interface IPresenter<V > {
    void attatchView(V v);

    void detachView();
}

public interface IBaseModel {
}

public interface ICallback<T> {
    void success(T t);
    void error(String error);
}


public abstract class BasePresenter<V extends IBaseView> implements IPresenter<V>{

    protected V view;
    private WeakReference<V> weakReference;
    @Override
    public void attatchView(V iBaseView) {
        weakReference = new WeakReference<>(iBaseView);
        view = weakReference.get();
    }

    @Override
    public void detachView() {

        if (view!=null){
            view = null;
        }
    }
}

2.业务类的封装

public interface ILoginView extends IBaseView {
    void success(String msg);
}

public class LoginPresenter extends BasePresenter<ILoginView> {

    LoginModel model;
    public LoginPresenter() {
        model = new LoginModel();
    }

    public void getLogin(){

        model.getLogin(new ICallback<String>(){
            @Override
            public void success(String s) {

                view.success(s);
            }

            @Override
            public void error(String s) {

                view.error(s);
            }
        });
    }
}

public class LoginModel implements IBaseModel {

    public void getLogin(ICallback iCallback){
        int ran = new Random().nextInt();

        if (ran%2==0){
            iCallback.success(ran+"");
        }else{

            iCallback.error(ran+"");
        }


    }
}

3.BaseMvpActivity的封装

public abstract class BaseMvpActivity<V extends IBaseView,P extends BasePresenter> extends BaseActivity implements IBaseView {

    P pre;

    @Override
    protected void initData() {
        pre = createPresenter();
        if (pre!=null){
            pre.attatchView(this);
        }
    }

    protected abstract P createPresenter();

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

        if (pre!=null){
            pre.detachView();
        }
    }
}

4.功能的调用

public class MainActivity2 extends BaseMvpActivity<ILoginView,LoginPresenter> implements ILoginView, View.OnClickListener {


    private EditText name;
    private EditText psw;
    private Button click;

    @Override
    public void onClick(View v) {
        pre.getLogin();
    }

    @Override
    protected LoginPresenter createPresenter() {
        return new LoginPresenter();
    }

    @Override
    protected void initView() {

        name = (EditText) findViewById(R.id.name);
        psw = (EditText) findViewById(R.id.psw);
        click = (Button) findViewById(R.id.click);
        click.setOnClickListener(this);
    }

    @Override
    protected int getLayout() {
        return R.layout.activity_main2;
    }

    @Override
    protected void initData() {
        super.initData();


    }


    @Override
    public void error(String error) {

        Toast.makeText(this, ""+error, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void success(String msg) {
        Toast.makeText(this, ""+msg, Toast.LENGTH_SHORT).show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值