由上面的一个关系图可以看出来M层和V层交互都在P层中,所以P层对M层或者V层应该是一个依赖组合的关
系,P层持有M层,V层对象或者以参数形式调用,代码实现:
public class Presenter {
private M m;
private V v;
public Presenter(M m, V v){
this.m = m;
this.v = v;
}
public void login(String[] params){
m.login(params, new Callback(){
@Override
public void onResponse(String result){
v.loginSuccess(result);
}
@Override
public void onError(Exception e){
v.loginFailed(e);
}
});
}
}
public class M{
public void login(String[] params){
//此处为网络请求代码(OKHttp,Retrofit),省略...
}
}
public interface V{
void loginSuccess(String result);
void loginFailed(Exception e);
}
然后在Activity或者fragment初始化presenter(activity自身实现view接口),在需要请求接口的地方
调用p.login();
进一步封装
思考:M层和View层交互在Presenter中,Presenter初始化在activity或者fragment中.是否可以
将presenter初始化放在BaseFragment或者BaseActivity中,在onCreate时候已经初始化.
问题已经提出来了,如何在一个类中将三个类关联起来,V<P, M>这种结构应该是可以的,通过泛型将三个类关
联起来,然后再获取泛型类型再通过Class.newInstance()初始化泛型对象.前提是泛型类型都有一个无参构
造方法, 获取泛型类型代码如下:
public class TypeUtil {
public static <T> T getType(int index, Object obj){
if (obj == null){
throw new NullPointerException("获取泛型的对象不能为空");
}
Type superclass = obj.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType){
Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
Type targetType = types[index];
try {
return ((Class<T>) targetType).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e){
e.printStackTrace();
}
}
return null;
}
public static Type getClassType(int index, Object obj){
if (obj == null){
throw new NullPointerException("获取泛型的对象不能为空");
}
Type superclass = obj.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType) {
Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
return types[index];
}
return null;
}
}
obj.getClass().getGenericSuperclass()为获取父类的type类,如果父类是带有泛型的,那么就是type
就是ParameterizedType型的,然后强转并且调用getActualTypeArguments方法获取泛型数组
然后是BaseActivity代码,这里名字使用MVPActivity:
public class MvpActivity<P extends BasePresenter, M> extends AppCompatActivity {
protected P mPresenter;
protected M mModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = getPresenterInstance();
mModel = getModelInstance();
if (mPresenter != null) {
mPresenter.setModel(mModel, this);
}
super.onCreate(savedInstanceState);
}
private P getPresenterInstance(){
return TypeUtil.getType(0, this);
}
private M getModelInstance(){
return TypeUtil.getType(1, this);
}
protected P getPresenter(){
return mPresenter;
}
protected M getModel(){
return mModel;
}
}
BasePresenter代码:
public class BasePresenter<M, V> {
private V mView;
private M mModel;
public void setModelView(M model, V v){
mModel = model;
mView = v;
}
public <V extends IView> V getView() {
return v;
}
public M getModel(){
return mModel;
}
}
使用方法:
public class TestActivity extends MVPActivity<LoginPresenter, Model> implements View{
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
getPresenter.login();
}
@Override
public void loginSuccess(String result){
}
@Override
public void loginSuccess(String result){
}
}