我应该如何在MVP中的活动之间传递数据(例如哪个项目被点击)?

我有MVP模式显示的项目列表。 视图是一个活动(aka ItemsList )。 我想显示下一个活动(也是MVP'ed,又名ItemDetails )与在ItemsList单击项目的详细信息。

ItemsList模型由来自Repository的数据提供。 所以实际上它是RMVP。 它看起来像这样:

  |->Model<->Presenter<->View [ItemsList] Repository<-| |->Model<->Presenter<->View [ItemDetails] 

所以ItemsList Model已经知道到底是什么Model项目被点击了,所以我可以从ItemsList直接传递给ItemDetails而无需再次从Repository获取数据/从数据映射到Model /为ItemDetails创build新模型等。

我应该如何在MVP中的活动之间传递数据(例如哪个项目被点击)?

解决scheme1

将这些数据与Intent( 类似于这里讨论的内容 )一起传递,但是…那么如何处理这些数据呢? 你从活动(视图)中的意图解压它,而你应该在MVP的另一端,即在模型中。 你从查看通过主持人到模型?

但是, ItemDetails Model不是从MVP的“下行”(来自Repository),而是从“MVP的ItemDetails ”(来自Presenter)创build的。

解决scheme2

将只点击项目的ID传递给ItemDetails视图(类似于android10 / Android-CleanArchitecture在UserDetailsActivity中使用字段private int userId ;这也是googlecodelabs的NoteDetailPresenter使用的)

然而,可能有一个问题,因为我可能有两个版本库的实现:

  • 一个带有caching,然后我可以将点击项的ID传递给ItemDetails视图(但是它似乎是过度devise的),类似于android10 / Android-CleanArchitecture在UserDetailsActivity中提出的字段private int userId;
  • 第二没有caching,然后我甚至不能要求ID,因为我没有访问列表抓取ItemsList

Solutions Collecting From Web of "我应该如何在MVP中的活动之间传递数据(例如哪个项目被点击)?"

最近,我也在我的应用程序中使用MVP。 我发现同样的问题,并使用意向将ItemListActivity的数据传递给ItemDetailActivity。 我传递了实现Parcelable接口的模型类,发现没有问题,它工作正常。

原因是:在ItemDetailActivity中,我们必须从数据库或存储库中提取数据,这会增加应用程序中的一个操作。

在ItemlistActivity中,您将只执行单个操作来获取所有数据。 而如果您将ItemListActivity的数据传递给ItemDetailActivity,则只需在ItemDetailActivity中获取数据,而无需执行任何特殊操作。

我build议你去解决scheme1。

在一个应用程序中,我使用了这两种方法加上第三个选项。 在第三个选项中,我使用应用程序级caching并在那里填充对象,并将caching键传递给新的意图。 这是没有回购caching的解决scheme2的变体。 我知道我只会暂时需要caching中的项目; 因此,从caching中删除项目以防止内存泄漏非常重要。 我通常喜欢第二种解决scheme,因为我不必将对象设为可见(可能有点懒惰)。 我没有注意到任何方法的性能差异。

最后,我决定在传递视图模型时(解决scheme1我所有的视图模型parcelable)。 使用domian模型时的解决scheme2(因为它们已经在数据库中了,所以传递一个key就简单多了)。 如果domian对象处于临时状态(或者是新的域对象还没有持久存在,或者是一个域对象,其中的状态可能与数据库不一致,即更改尚未持续,并且活动由于某种原因而暂停)

如果您使用的是视图优先导航,我认为您可以创build自己的演示者层包(或类似的东西),并意图发送到新的活动。 然后新的活动将提取这个包,并将其传递给演示者。

另外,我认为还有第三个考虑 – 在MVP中, 模型是对问题域进行build模,并且应该能够存在而不pipeselect的VP如何 。 如果你的ItemDetails和ItemList是同一个问题域的一部分,那么你的模型可能会模拟它们,而你实际上想要做的是以两种不同的方式呈现数据(一个作为列表,一个作为细节) 。

在这种情况下, 共享模型可能是可行的,只有不同的表示和查看层。 在这种情况下,一旦你的细节已经传回给你模型,只是附加一个新的演示者来呈现所选的ItemDetail。

当一个项目被点击时,你应该把这个信息传递给主持人,他将决定哪些数据需要发送到哪个活动。 然后,演示者可以将数据和目标活动类打包为一个意图,并将其传递回原始视图。 例如,像navigateToActivity(意图我)。 原始视图以意图提供的意图开始活动。 这使原始视图对下一个屏幕需要什么是愚蠢的(因为可能有多个选项)。 业务逻辑是主持人的工作。

然后当Kishan说,当主持人被初始化时,新视图的主持人解包与意图一起发送的数据。 目标视图在知道如何处理数据的意图方面也是愚蠢的。