1. 目的
在Android开发中,MVP模式的开发为大多数人所使用,在MVP模式中,一般需要在Activity中创建与之对应的Presenter类。之前项目中实现的方法比较繁琐,通过查资料以后,进行了部分优化,特此记录。
2. 老的实现方式
不废话,直接上代码。
public abstract class BaseActivity<T extends BasePresenter> extends Activity{
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
}
/**
* 定义一个抽象方法,由继承BaseActivity的子类去实现
*/
protected abstract T createPresenter();
}
class TestActivity extends BaseActivity<TestPresenter> {
/**
* 在每个继承BaseActivity的子Activity去实现createPresenter方法
*/
@Override
protected TestPresenter createPresenter() {
return new TestPresenter(this);
}
}
3. 改进以后的实现方式
/*
* 这里在base内部实现了createPresenter方法,当然还有可能有其他的抽象方法,所以这里的类暂时还是用一个抽象类
* 来表示
*/
public abstract class BaseActivity<T extends BasePresenter> extends Activity{
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
}
/**
* 直接在createPresenter中拿到当前类的泛型的class,利用反射制造一个对象并返回
*/
protected T createPresenter(){
//这里获得到的是类的泛型的类型
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
if (type != null) {
Type[] actualTypeArguments = type.getActualTypeArguments();
Class<T> tClass = (Class<T>) actualTypeArguments[0];
mPresenter = PresenterFactory.creatPresenter(tClass);
}
};
/**
* presenter 的工厂类
*/
public class PresenterFactory {
public static <T extends BasePresenter> T creatPresenter(Class<T> tClass) {
T t = null;
try {
t = tClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
}
/*
* 继承了BaseActivity的子类,不再需要实现createPresenter方法,可以直接使用mPresenter进行操作
*/
class TestActivity extends BaseActivity<TestPresenter> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//直接使用presenter类(不再需要通过实现createPresenter方法来得到presenter的对象)
mPresenter.doSth();
}
}
3. 总结
这里拿Activity和Presenter类来举例,其实在开发中还有其他的场景,需要在一个公共的父类下,有一个可变的参数类型的对象,在具体的子类中去指定这个可变参数类型的类型的场景。当然了,以上只是个人的一些体会与经验,如果有错误之处,还望读者予以指正。