【发布时间】:2016-08-23 06:21:13
【问题描述】:
我在片段中使用了 ViewPager 和 4 个标签。每个选项卡都有一个 RecyclerView,它显示了电影的图像和标题。当我从另一个片段来回切换到这个片段时,每次切换都会出现内存泄漏。我无法弄清楚这到底发生在哪个地方。 具有 ViewPager 的 Fragment 类:
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:
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);
}
}
}
}
有人能指出发生内存泄漏的正确方向吗?
【问题讨论】:
-
你为什么这么肯定有内存泄漏?
-
@RobinDijkhof Android Monitor 每次返回此片段时都会显示接近 8MB 的跳跃。此外,它在每次切换时都会变得越来越慢,直到最终崩溃。可能是在片段替换时永远不会释放图像内存,但我也无法得到正确的结果。
-
这不是完整的解决方案,而是使用小的drawables。
标签: android android-viewpager android-recyclerview android-tablayout