【问题标题】:Performance issue with loading large data in recyclerview in a viewpager在 viewpager 的 recyclerview 中加载大数据的性能问题
【发布时间】:2018-12-07 13:25:32
【问题描述】:

我的设置包括两个带有 viewpager 的选项卡设置。每个选项卡都包含一个片段,其中包含一个显示歌曲列表的回收视图。 问题是,当将大量歌曲加载到 recyclerview 时,用户界面会冻结一段时间。歌曲数量超过2000首时,系统会卡住很长时间,然后抛出OutOfMemory错误。

注意:在一个简单的片段或活动中将数据加载到recyclerview中完全没有性能问题,即使数据集非常大。

我该如何优化呢?

【问题讨论】:

  • 使用google的paging支持库
  • @pskink 我使用MediaBrowserServiceCompat 指定发送项目列表为List。所以分页库PagedList 在这里不起作用。除非我必须单独获取 mediaItems,而不是通过 MediaBrowserCompat OnSubscriptionCallback。我还没有弄清楚。
  • List<MediaItem> 的大小是多少?或者它有多少项?
  • 大小取决于手机中歌曲的数量。对于拥有超过 100 首歌曲的手机,问题变得更加明显

标签: android performance android-fragments android-recyclerview android-viewpager


【解决方案1】:

于是我找到了问题的根源。 NestedScrollView 内的 Recyclerview。因为我要显示三个 RecyclerView,所以我不得不使用 NestedScrollView 来包装它们。但是从这个question,我了解到在nestedScrollView 中拥有recyclerview 将使recyclerview 想要在渲染它们之前一次创建所有视图。这就是为什么每次显示数据时 UI 都会冻结的原因。

【讨论】:

    【解决方案2】:

    如果你只是想显示歌曲的基本信息,你可以使用List作为数据,在SongInfo中包含名字,专辑,歌手...等,不会占用太多内存

    【讨论】:

    • 我尝试使用带有基本歌曲信息的简单 Song 对象,但仍然遇到同样的问题。通常我使用从MediaBrowserServiceCompat 的onLoadChildren 返回的MediaItem 列表,但是在渲染项目时我仍然遇到同样的问题,即使在转换为更简单的对象之后也是如此。
    【解决方案3】:

    简单。只需设置 layoutManager autoMeasureEnable = true 或 覆盖 LayoutmanlayoutManager.setAutoMeasureEnabled(false)

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多