这是网上常见的MvpActivity基类
public abstract class BaseMvpActivity<t extends BaseAdapter> extends AppCompatActivity {
public T presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = initPresenter();
}
@Override
protected void onResume() {
super.onResume();
presenter.attach((V)this);
}
@Override
protected void onDestroy() {
presenter.dettach();
super.onDestroy();
}
public abstract T initPresenter();
}
这个基类完成了presenter的实例化、presenter持有的Activity对象的释放.
那么当一个Activity有多个功能时,应该怎样实现呢。
我想,一种方法是让一个presenter实现多个功能,这时可以继续用上面的基类,但是程序的功能不容易复用。比如Activity1有功能A和B,Activity2有功能C和D,当Activity3有功能A和D时,无法复用Activity1和2的presenter; 一种方法是一个Activity持有多个presenter,这时就要重写BaseActivity,我写了一个,如下:
public abstract class MvpActivity extends BaseActivity {
protected Map<String, BasePresenter> presenters;
@Override
protected void onCreate(Bundle savedInstanceState) {
presenters = createPresenter();
super.onCreate(savedInstanceState);
}
protected abstract Map<String, BasePresenter> createPresenter();
@Override
protected void onDestroy() {
super.onDestroy();
for (Map.Entry<String, BasePresenter> entry : presenters.entrySet()) {
if (entry.getValue() != null) {
entry.getValue().detachView();
}
}
}
protected BasePresenter getPresenter(){
return presenters.entrySet().iterator().next().getValue();
}
protected BasePresenter getPresenter(String key){
return presenters.get(key);
}
}
但是这个基类使用起来很别扭,说他别扭是因为:
在第一版中有public T presenter这个变量,可以直接调用presenter的功能,第二版中首先要调用getPresenter,还要类型转换才能使用。还有在createPresenter抽象方法实现起来不想第一版那么直观。
我JAVA功力不够,还请各位指点一下。
一个activity对应一个presenter A,然后对应的这个presenter A中可以拓展下,它只做为一个代理类,其它具体实现交给其它的presenter B、C、D去实现,这样是不用改变activity的调用方式,也可以复用presenter,不过感觉怪怪的。。。