当我从一个菜单移动到另一个菜单并返回时,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 会调用服务器的主要内容,如果未能解决你的问题,请参考以下文章

当切换到案例1时,切换语句切换到案例2

如何将项目从一个菜单移动到另一个菜单?

当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?

如何本地化后退按钮?

无法使用菜单单击和移动活动

onDetach()不要求从一个片段移动到另一个片段