Android MVP,如何协调多个视图?

Android MVP, how to coordinate multiple views?

我有一位主持人P。它旨在控制某种类型视图的所有内容 V。我有多个这样的视图:V1V2、... Vn。与一个视图交互 Vx,可能会对其他视图产生影响 Vy

最好的协调方式是什么?主持人应该互相交谈吗?演示者是否应该引用所有视图?

一种方法是演示者 P 持有视图 V 并且视图 V 继承 V1V2、...VnV 可以跨所有视图容器(片段和活动)访问方法。

public interface MainView extends BaseView, ErrorView{ //V
  void showProducts(@Nullable List<Product> products);
} 


public interface BaseView{ //V1 
   void setLoading(boolean loading);
   void showConfirmationDialog(@StringRes int title, @StringRes int message);
}

public interface ErrorView{ //V2
  void showErrorSnackBar(@StringRes int message);
}


public class ProductListFragment extends ... implements MainView{


}

根据我的经验,除了混乱和空洞的方法之外,这工作正常,就可读性而言并不好。

在您的主要演示者中保存其他演示者的引用是可以的,只要您确保他们还活着。这可能会导致反模式。

另一种方法是分别持有每个演示者,每个演示者独立使用事件:

@Override
public void showProducts(List<Product> products){
   // do something with products that Presenter1 has dispatched for presenting
   presenter2.doSomethingOnProducts();
}

这是利益相关方之间无缝沟通的结果。

混合 Observer 模式和 MVP 也很好。

一个视图应该对其他视图一无所知。 View 应该只与其 Presenter 通信。一个 Presenter 也不应该知道其他 Presenter。为避免演示者凝聚使用事件(EventBus、Otto、RxJava Subjects...)。