当我从一个菜单移动到另一个菜单并返回时,Leanback android Tv 中的 BrowseSupportFragment 会调用服务器
Posted
技术标签:
【中文标题】当我从一个菜单移动到另一个菜单并返回时,Leanback android Tv 中的 BrowseSupportFragment 会调用服务器【英文标题】:BrowseSupportFragment in Leanback android Tv makes Server calls when I move from one menu to another and back 【发布时间】:2021-03-04 16:18:22 【问题描述】:我已经实现了 Leanback 库中的 BrowseSupportFragment。它有一个带有 rowItems 和 headerIcons 的左侧导航栏。每次我从导航抽屉中的一行移动时,都会重新加载片段。这不好,因为它不断进行服务器调用,因此我的图像缓存不起作用。这就是我在 BrowseSupportFragment 中调用每个片段的方式, 使用与此处相同的想法: https://www.javatips.net/api/platform_frameworks_support-master/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
private static class PageRowFragmentFactory extends BrowseSupportFragment.FragmentFactory
private final BackgroundManager mBackgroundManager;
PageRowFragmentFactory(BackgroundManager backgroundManager)
this.mBackgroundManager = backgroundManager;
// new fragment is registered and called from here
@Override
public Fragment createFragment(Object rowObj)
Row row = (Row) rowObj;
mBackgroundManager.setDrawable(null);
if (row.getHeaderItem().getId() == HEADER_ID_1)
return new MovieGalleryFragment();
else if (row.getHeaderItem().getId() == HEADER_ID_2)
return new SeriesGalleryFragment();
else if (row.getHeaderItem().
getId() == HEADER_ID_3)
return new SortByGenreFragment();
else if (row.getHeaderItem().
getId() == HEADER_ID_4)
return new SortByCountryFragment();
else if (row.getHeaderItem().
getId() == HEADER_ID_5)
return new WebViewFragment();
throw new
IllegalArgumentException(String.format("Invalid row %s", rowObj));
public static class PageFragmentAdapterImpl extends MainFragmentAdapter<MovieGalleryFragment>
public PageFragmentAdapterImpl(MovieGalleryFragment fragment)
super(fragment);
在我的片段中我扩展
public class MovieGalleryFragment extends VerticalGridSupportFragment implements BrowseSupportFragment.MainFragmentAdapterProvider
final MainActivityFragment.PageFragmentAdapterImpl mMainFragmentAdapter = new MainActivityFragment.PageFragmentAdapterImpl(this);
..........
所以当我从 MovieGalleryFragment() 移动到 SeriesGalleryFragment 并返回到 MovieGalleryFragment() 时,它会重新加载并从服务器调用图像。我该如何防止这种情况??
谢谢。
【问题讨论】:
【参考方案1】:您的图像缓存不应存在于这些片段之一中,因此被销毁和重新创建的片段不应导致另一个提取。例如,MovieGalleryFragment 应在尝试从服务器获取图像之前从应用程序范围的缓存中请求图像。由于您要维护内存中缓存、磁盘缓存和清理规则,因此正确执行此操作可能非常复杂。我建议您使用 Picasso、Coil、Glide 等。一般来说,无论如何,您都希望以这种方式严重依赖缓存,因为用户可能会关闭应用程序并在不久之后重新打开它。
【讨论】:
是的,没错。但是如果我想恢复片段(这样prev选择的位置和其他东西不会重新创建)怎么办?有办法吗?以上是关于当我从一个菜单移动到另一个菜单并返回时,Leanback android Tv 中的 BrowseSupportFragment 会调用服务器的主要内容,如果未能解决你的问题,请参考以下文章