如何在活动(主从流)之间传递大型集合

9

背景:

我正在实现一个从 Web 服务中读取电影信息的应用程序。该 Web 服务返回有关每部电影的多个信息(标题、日期、海报 URL、导演、演员等)。

该 Web 服务支持分页,因此电影会以100个为一组加载。

实现:

我们的想法是展示一个包含所有海报的网格视图,当用户向下滚动时自动请求更多内容。

enter image description here

当单击项时,用户会导航到详细查看所选电影的相册,并使用 ViewPager 滚动查看详情。

enter image description here

因此,我们的想法是将在网格中检索到的电影集合传递给“DetailedGalleryActivity”。

更新:还需要在用户离开片段时保存状态,以处理片段生命周期。您可以启用“开发者选项:不保留活动”来测试它

问题:

我的第一种方法是将电影集合序列化为 JSON,并将其作为字符串附加到 Activity 中。但是,由于电影列表很大,如果用户在网格中滚动了很多次,则该 JSON 的大小非常大,Bundle 无法处理(请参见最大字符串数据的Max size of string data),会导致运行时异常。

我已经查看了一些关于在启动详细信息活动之前在 SharedPreferences 或其他持久性存储中保存数据并从详细信息中访问它的答案。我认为这种解决方案很奇怪,因为它忽略了使用自定义和手工制作的解决方案在活动之间传递数据的机制。

如何解决这个问题呢?


你可以将每部电影的JSON存储在一个文件中(movie_1,movie_2等),然后仅传递电影的ID并从文件中获取当前电影的数据。可能,在完成后删除所有这些文件是个好主意。 - GVillani82
你想使用Activity而不是Fragment有特别的原因吗? 如果你使用Fragment,你可以简单地将DetailedGallery作为一个Fragment加载,并将数据作为参数传递。 - MercilessMaverick
1个回答

5

我不确定这是否是一个好建议。

创建另一个类并添加一个静态方法,我们将其命名为MovieUtil。

//示例

private class MovieUtil {
  private static List<Movies> movies;
  public static List<Movies> getMovies();//getter
  public static void setMovies(List<Movie> movies);//setter
}

在启动DetailedGalleryActivity之前,请在MovieUtil.setMovies()中设置电影列表。

然后,在DetailedGalleryActivity的oncreate方法中使用MovieUtil.getMovies()初始化列表。

注意:当您关闭DetailedGalleryActivity时,可以清除movieutil中的电影列表。


这是一个好主意 - 这个技术出现在以下问题的答案中,使用了“使用单例类”的方法。 https://dev59.com/jG445IYBdhLWcg3wZJiw - MercilessMaverick
我也不知道单例模式和静态方法哪个更好,有很多人争论哪个更好。但是在这种情况下,为了简单起见,我使用静态方法。 :) - ville101
我更新了问题,因为这个解决方案可以解决活动之间的数据传递,但不能在onSaveInstanceState()中保存信息,以便在活动被销毁后恢复界面。 - Addev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接