这是网上常见的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功力不够,还请各位指点一下。
활동은 발표자 A에 해당하며 해당 발표자 A는 확장될 수 있습니다. 이는 프록시 클래스로만 사용되며 다른 특정 구현은 다른 발표자 B, C, D에 의해 구현됩니다. 액티비티를 변경할 필요가 없습니다. 호출 메서드에서 프리젠터를 재사용할 수도 있지만 느낌이 이상합니다. . .
View와 Presenter 사이에는 프로토콜 제약이 있습니다.
기존 V1, P1, V2, P2가 있고 ActivityA가 P1/P2의 기능에 해당한다고 가정하면 V1/을 구현한다는 것도 나타내야 합니다. V2 인터페이스입니다. P1과 P2를 구현하는 PresenterA가 있어야 합니다. 이것이 완전한 VP 프로토콜입니다.
여러 페이지가 동일한 기능을 사용할 수 있으므로 가장 간단한 방법은 내 노드에서 다중 상속을 사용하는 것입니다(하나의 Presenter 구현 ABCD 4). 인터페이스), 액티비티가 실제로 동일한 프레젠터를 사용하더라도 지금 구현되었다고 확신한다면 위의 방법에 따라 프록시를 구현하세요.
여러 프리젠터를 실제로 구현하고 싶다면 다양한 클래스를 정의하여 다양한 프리젠터 확장을 지원하면 됩니다.
으아악http://blog.csdn.net/github_3... 소개가 있습니다