BrowseSupportFragment in Leanback android Tv makes Server calls when I move from one menu to another and back

734 Views Asked by At

I have implemented the BrowseSupportFragment from the Leanback library. It has a left navigation bar with rowItems and headerIcons. Each time I move from one row in the navigation drawer the fragments are reloaded. This is not good since it keeps making server calls and therefore my image caching doest work. This is how I call each fragment in my BrowseSupportFragment, using same idea as here: 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);
        }
    }


and in my fragments i extend

public class MovieGalleryFragment extends VerticalGridSupportFragment implements BrowseSupportFragment.MainFragmentAdapterProvider{

final MainActivityFragment.PageFragmentAdapterImpl mMainFragmentAdapter = new MainActivityFragment.PageFragmentAdapterImpl(this);

  
        
..........       
 }

so when i move from MovieGalleryFragment() to SeriesGalleryFragment and back to MovieGalleryFragment(), it is reloaded and images recalled from server. How do I prevent this ??

thank you.

1

There are 1 best solutions below

1
Ian G. Clifton On

Your image cache shouldn't be live in one of these fragments, so the fragment being destroyed and recreated should not cause another fetch. For example, MovieGalleryFragment should request an image from an app-wide cache before attempting to fetch from the server. Since you want to maintain an in-memory cache, a disk cache, and cleanup rules, it can be very complicated to get this right. I'd recommend relying on something like Picasso, Coil, Glide, etc. In general, you want to heavily rely on cache this way anyway since the user might close the app and reopen it shortly after.