适配器导致内存泄漏

时间:2018-02-23 16:22:01

标签: android memory-leaks android-recyclerview

我面临一些内存泄漏问题。起初我想,它可能是WeakReferenceListeners,但后来我故意在构造函数中将它们设置为null(没有点' em)以确保内存泄漏是由其他一些引起的问题。我很确定它位于OnCreateViewHolderOnBindViewHolder方法的某个地方。

public class OutterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<...> data;
private InnerAdapter innerAdapter;
private ItemClickListener itemClickListener;
private WeakReference<Activity> reference;

public OutterAdapter (List<..> dataList,
                       Activity activity,
                       ItemClickListener itemClickListener) {
    data = dataList;
    itemClickListener = itemClickListener= null;
    //mActivityReference = new WeakReference<>(activity);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == A)
        return new AViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, null));
    else
        return new BViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, null));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final Item item = data.get(position);
    if (holder instanceof AViewHolder) {
        ViewPager vP = ((AViewHolder) holder).mViewPager;
        vP.setAdapter(newXAdapter(data,/*clickListener*/null));
        CirclePageIndicator pageIndicator = ((AViewHolder) holder).mIndicator;
        pageIndicator.setViewPager(vP);
    } else {
        BViewHolder bViewHolder = (BViewHolder) holder;
        bViewHolder.getTitleView().setText(item.getTitle());
        new InnerAdapter(item, /*clickListener*/ null);
        bViewHolder.getRecyclerView().setAdapter(innerAdapter);
    }
}

如果您没有从代码中理解,那么 - 我是一个嵌套的Recyclerview。在OutterAdapter's我在InnerAdaptersetAdapter(innerAdapter);创建了OnBindViewHolder。是的,可能不是嵌套Recyclerviews的最佳场景,但我想了解泄漏的是什么?是什么导致这个?在分析器中,我发现所有OutterAdapter值都是null(正如我设置的那样),但OutterAdapter有许多实例切换/销毁视图,其中应该只有1或无。 InnerAdapter的x2计数通常为OutterAdapter。我尝试了recyclerView.setAdapter(null)父视图onDestroy()方法,但它没有做任何事情,同样适用于将这些UI小部件归零的不同变体。

1 个答案:

答案 0 :(得分:0)

您可以尝试LeakCanary,将其添加到您的应用中,只要发生内存泄漏,您就会收到通知。它还提供了可能导致它的原因的提示。

我的建议是使用snap helper和overflow indicator切换带有recyclerview的nersted view pager。