本文共 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 staticT 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 BaseActivityextends 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("用户名错误"); } }