1. 目的
在Android開發(fā)中,MVP模式的開發(fā)為大多數(shù)人所使用性芬,在MVP模式中曹宴,一般需要在Activity中創(chuàng)建與之對(duì)應(yīng)的Presenter類。之前項(xiàng)目中實(shí)現(xiàn)的方法比較繁瑣往弓,通過查資料以后,進(jìn)行了部分優(yōu)化蓄氧,特此記錄函似。
2. 老的實(shí)現(xiàn)方式
不廢話,直接上代碼喉童。
public abstract class BaseActivity<T extends BasePresenter> extends Activity{
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
}
/**
* 定義一個(gè)抽象方法撇寞,由繼承BaseActivity的子類去實(shí)現(xiàn)
*/
protected abstract T createPresenter();
}
class TestActivity extends BaseActivity<TestPresenter> {
/**
* 在每個(gè)繼承BaseActivity的子Activity去實(shí)現(xiàn)createPresenter方法
*/
@Override
protected TestPresenter createPresenter() {
return new TestPresenter(this);
}
}
3. 改進(jìn)以后的實(shí)現(xiàn)方式
/*
* 這里在base內(nèi)部實(shí)現(xiàn)了createPresenter方法,當(dāng)然還有可能有其他的抽象方法,所以這里的類暫時(shí)還是用一個(gè)抽象類
* 來表示
*/
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中拿到當(dāng)前類的泛型的class蔑担,利用反射制造一個(gè)對(duì)象并返回
*/
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的子類牌废,不再需要實(shí)現(xiàn)createPresenter方法,可以直接使用mPresenter進(jìn)行操作
*/
class TestActivity extends BaseActivity<TestPresenter> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//直接使用presenter類(不再需要通過實(shí)現(xiàn)createPresenter方法來得到presenter的對(duì)象)
mPresenter.doSth();
}
}
3. 總結(jié)
這里拿Activity和Presenter類來舉例啤握,其實(shí)在開發(fā)中還有其他的場(chǎng)景鸟缕,需要在一個(gè)公共的父類下,有一個(gè)可變的參數(shù)類型的對(duì)象排抬,在具體的子類中去指定這個(gè)可變參數(shù)類型的類型的場(chǎng)景懂从。當(dāng)然了,以上只是個(gè)人的一些體會(huì)與經(jīng)驗(yàn)蹲蒲,如果有錯(cuò)誤之處番甩,還望讀者予以指正。