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);
}
}
}
}
は、誰かがメモリリークが起きてしまう正しい方向に私を指すことができますか?
これは役立ちますhttp://stackoverflow.com/a/35327864/4031815 – commonSenseCode
なぜメモリリークが確実ですか? –
@RobinDijkhof Androidモニターは、この断片に戻ってくるたびに8MBに近いジャンプを示しています。また、最終的にクラッシュするまでスイッチごとに遅くなります。フラグメントが置換されても画像メモリが解放されることはありませんが、それを正しく取得できませんでした。 – gionee10