0

4つのタブを持つフラグメント内にViewPagerを使用しました。各タブには画像とタイトルを示すRecyclerViewがあります。このフラグメントを別のフラグメントから前後に切り替えると、すべてのスイッチでメモリリークが発生します。私は正確にこれが起こる場所を把握できませんでした。各タブのViewPager、RecyclerViewのメモリリーク

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:ViewPagerあり 断片クラス

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); 
     } 
    } 

} 

} 

は、誰かがメモリリークが起きてしまう正しい方向に私を指すことができますか?

+0

これは役立ちますhttp://stackoverflow.com/a/35327864/4031815 – commonSenseCode

+0

なぜメモリリークが確実ですか? –

+0

@RobinDijkhof Androidモニターは、この断片に戻ってくるたびに8MBに近いジャンプを示しています。また、最終的にクラッシュするまでスイッチごとに遅くなります。フラグメントが置換されても画像メモリが解放されることはありませんが、それを正しく取得できませんでした。 – gionee10

答えて

0

メモリリークは見つけにくい場合がありますが、これらのリークを見つけて修正するためのツールが用意されています。

LeakCanaryを見て、これをアプリに追加すると、メモリリークが発生するたびに通知が届きます。また、それが何を引き起こしているのかについてのヒントも示しています。

また、Androidのavoid memory leaksへのいくつかの方法を示すブログへのリンクもあります。

関連する問題