T-MVP 比MVP更加的解耦灵活的利用泛型(附带一个快速创建MVP接口的Android Studio插件-TMVPHelper)
TMVPHelper源码地址:https://blog.****.net/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("用户名错误");
}
}