TMVPHelper源码地址:https://blog.youkuaiyun.com/wingichoy/article/details/52148695
插件下载:https://github.com/githubwing/MVPHelper

我们的BaseModel 和BaseView 可以不做任何操作但是BasePresenter需要代码:
/*
* 2018年7月3日 15:59:58
* 做了什么事情 在这个类里面我们把 M V 注入到了P层里面
* */
public class BasePresenter<M, V> {
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>T getT(Object o, int i){ superclass = o.getClass().getGenericSuperclass(); try { return ((Class<T>)(((ParameterizedType)superclass).getActualTypeArguments()[i])).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }
再看BaseActivity类:
public abstract class BaseActivity<P extends BasePresenter,M extends BaseModel> 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("用户名错误");
}
}
本文介绍了一个简化MVP模式开发的工具TMVPHelper,通过泛型和反射机制实现Model与View的自动注入,使得Presenter可以无需手动实例化依赖对象。文章详细展示了如何在BaseActivity中利用TUtil工具类进行类型实例化,并将View与Model注入到Presenter中。
240

被折叠的 条评论
为什么被折叠?



