【问题标题】:Android Tv Leanback best place to load icon images to reduce memory footprintAndroid TV Leanback 加载图标图像以减少内存占用的最佳位置
【发布时间】:2025-12-16 21:25:03
【问题描述】:

我使用 Leanback 为 Android 电视制作了一个应用程序,我正在使用 BrowseSupportFragment,我的项目由实现 Presenter 类的 CardPresenter 类呈现。我正在为图标加载 onBindViewHolder 方法中的图像。但是它将太多图像加载到内存中,我通过 Logcat 检查加载的总图像太多(基本上加载了大约 54 行,每行有 10-12 个卡)。这导致应用程序中的 gc 暂停。我想要的是只加载可见图像。尝试使用 Presenter 类中的 onViewAttachedToWindow 方法,但是 onBindViewHolder 和 onViewAttachedToWindow 方法似乎被调用了相同的次数。我想要做的是懒惰地加载图像,当滚动列表时,尝试搜索很多但无法得到正确的答案,有人可以帮我吗?

【问题讨论】:

    标签: android android-tv leanback


    【解决方案1】:

    onBindViewHolder 是触发图像加载的正确位置。当您的布局膨胀时,您应该看到所有可见项目都调用了 onBindViewHolder,有时会根据截止值为下一个项目提供缓冲区。如果您看到的是 onBindViewHolder 被调用的次数远远超过合理的次数(例如,您在屏幕上看到 20 个项目,但它被调用了 100 次),那么您应该确保您的布局具有设定的大小。

    例如,如果您正在显示卡片,并且在加载图像后才设置卡片的宽度,则您的宽度实际上可能为 0,因此该行中的每张卡片都被绑定,从而触发您的图像请求。 ImageCardView 具有 setMainImageDimensions 辅助方法来设置 LayoutParams,因此您可以在 onCreateViewHolder(如果所有项目的大小相同)或 onBindViewHolder(如果大小取决于项目)中调用它。

    【讨论】:

    • 是的 onBindViewHolder 被调用的次数比必要的多得多,只有 2 行可见,而几乎所有行都调用了 onBindviewHolder,我已经使用 onitemselected 侦听器向我的演示者发出信号(保存在地图中)在片段级别)它现在需要为该行加载图像。但我意识到这是一件坏事,因为我看到随机错误,图像未加载。继续...
    • 您所说的大小确实有道理,实际上我是先创建行,然后使用异步任务为每行填充项目,这可能是一个问题,因为行首先呈现时没有项目。我将尝试使用尺寸的解决方案,如果可行,我会回来接受这个答案,感谢您的建议。我还注意到,即使我减少了内存占用,该应用程序似乎仍然需要花费大量时间来绘制片段,这也可能是解决方案。
    • 我使用了下面的代码 ListRowPresenter presenter = new ListRowPresenter(); presenter.setRowHeight(ContentItemPresenter.CARD_HEIGHT);解决问题。现在 onBindViewHolder 被正确调用了很多次,我现在不需要任何 hack 来实现开箱即用的延迟加载。
    最近更新 更多