【问题标题】:Memory leaks in ViewPager, RecyclerViewViewPager、RecyclerView 内存泄漏
【发布时间】: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


【解决方案1】:

内存泄漏可能很难找到,但是有一些工具可以帮助您找到并修复这些泄漏。

查看LeakCanary,将其添加到您的应用程序中,只要有内存泄漏,您就会收到通知。它还提供了可能导致它的提示。

另外,这里有一个博客链接,其中显示了在 Android 中avoid memory leaks 的一些方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 2020-07-13
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2019-09-16
    相关资源
    最近更新 更多