0

I have used ViewPager inside fragment with 4 tabs. Each tab has a RecyclerView which shows an image and the title for the movie. When I switch back and forth to this fragment from another fragment, there is memory leaks at every switch. I could not figure out at which place exactly does this happen. Fragment class which has the ViewPager:

public class FragmentMoviesTab extends Fragment {

String[] tabTitles = {"Tab 1", "Tab 2", "Tab 3", "Tab 4"};

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
View view;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_tab, container, false);

    viewPager = (ViewPager) view.findViewById(R.id.viewPager);
    viewPager.setPageTransformer(true, new AnimatePageTransformer());
    FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(getActivity().getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    tabLayout = (TabLayout) view.findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(viewPager);

    return view;
}

class FragmentStatePagerAdapter extends android.support.v4.app.FragmentStatePagerAdapter {

    public FragmentStatePagerAdapter(FragmentManager manager) { super(manager); }

    @Override
    public Fragment getItem(int position) { return new RecyclerMovies(); }

    @Override
    public int getCount() { return tabTitles.length; }

    @Override
    public CharSequence getPageTitle(int position) { return tabTitles[position]; }

    @Override
    public Parcelable saveState() { return null; }

}

}

RecyclerFragment for each tab:

public class RecyclerMovies extends android.support.v4.app.Fragment {

View view;
RecyclerView recyclerView;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.recycler, container, false);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setNestedScrollingEnabled(true);
    RecyclerMoviesAdapter adapter = new RecyclerMoviesAdapter();
    recyclerView.setAdapter(adapter);

    return view;
}

public class RecyclerMoviesAdapter extends RecyclerView.Adapter<RecyclerMoviesAdapter.MyViewHolder> {

    int[] movieTrailers = {R.drawable.movie_1, R.drawable.movie_2, R.drawable.movie_3, R.drawable.movie_4};
    String[] movieNames = {"Movie A", "Movie B", "Movie C", "Movie D"};

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
        View itemLayoutView =  LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.card_movie, viewGroup, false);
        return new MyViewHolder(itemLayoutView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder viewHolder, int pos) {
        final int position = viewHolder.getAdapterPosition();
        viewHolder.movieName.setText(movieNames[position % 4]);
        viewHolder.movieTrailer.setImageResource(movieTrailers[position % 4]);
    }

    @Override
    public int getItemCount() {
        return 10;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView movieName;
        ImageView movieTrailer;

        public MyViewHolder(View itemView) {
            super(itemView);
            movieName = (TextView) itemView.findViewById(R.id.movie_name);
            movieTrailer = (ImageView) itemView.findViewById(R.id.movie_trailer);
        }
    }

}

}

Can someone point me to the correct direction where the memory leaks would be happening?

gionee10
  • 9
  • 1
  • 2

1 Answers1

0

Memory leaks can be a pain to find, however there are tools out available that help you find and fix these leaks.

Take a look at LeakCanary, add this to your app and you'll get a notification whenever there is a memory leak. It also gives hints on what might be causing it.

Also, here's a link to a blog that shows some ways to avoid memory leaks in Android.

Owen Lilly
  • 171
  • 3
  • 10