博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
T-MVP 比MVP更加的解耦灵活的利用泛型(附带一个快速创建MVP接口的Android Studio插件-TMVPHelper)
阅读量:4205 次
发布时间:2019-05-26

本文共 2369 字,大约阅读时间需要 7 分钟。

TMVPHelper源码地址:

插件下载:

我们的BaseModel 和BaseView 可以不做任何操作但是BasePresenter需要代码:

 

/**   2018年7月3日 15:59:58* 做了什么事情  在这个类里面我们把  M  V 注入到了P层里面* */public class BasePresenter
{ public Context context; public M mModel; public V mView; public void setMV(M mModel,V mView){ this.mModel=mModel; this.mView=mView; }}

其中有2个泛型变量M和T与一个set方法通过set方法将View与Model传入到Presenter中来。

 

但是怎么将Model与View实例化并且注入今Presenter的呢?

最关键的代码来了:

我们先看一个工具类TUtil:

 

 

public class TUtils {    private static Type superclass;    //通过泛型的反射形式获取传入类的对象,然后return出去    public static 
T getT(Object o, int i){ superclass = o.getClass().getGenericSuperclass(); try { return ((Class
)(((ParameterizedType)superclass).getActualTypeArguments()[i])).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; }}

再看BaseActivity类:

public abstract class BaseActivity

extends AppCompatActivity { public P mPresenter; public M mModel; private Unbinder bind; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); initView(); } protected abstract void initView(); private void init() { setContentView(getLayoutID()); bind = ButterKnife.bind(this); //初始化当前的activity 把当前的activity赋值到App变量里面 App.mActivity =this; //初始化我们的p和m层 mPresenter = TUtils.getT(this,0); mModel =TUtils.getT(this,1); //判断下当前的activity是否实现了view的接口,如果实现了,把m,v给注入到p层 if (this instanceof BaseView){ mPresenter.setMV(mModel,this); } } protected abstract int getLayoutID(); @Override public void onDestroy() { super.onDestroy(); bind.unbind(); }}

BaseActivity带有两个泛型,分别限制是继承BasePresenter与BaseModel,通过TUtil生成两个Model与Presenter中,同时调用Presenter的setVM方传入View与Model。

此时我们边能够再Activity中通过mPresenter调用Presenter,在Presenter中通过mView与mModel分别调用View与Model了。

我们 m层 v层 p层 : 不用new 任何实例化对象,直接可以调用里面的方法即可;这就TMvp比较好的地方了;

public class LoginPresenter extends LoginContract.Presenter {
    @Override
    public void login(String name, String psw) {
        //这个就是TMvp比较好的地方
        if (mModle.login(name,psw)) {
            mView.loginSucc();
        }else mView.loginFailMsg("用户名错误");
    }
}

你可能感兴趣的文章