我面临一些内存泄漏问题。起初我想,它可能是WeakReference
或Listeners
,但后来我故意在构造函数中将它们设置为null(没有点' em)以确保内存泄漏是由其他一些引起的问题。我很确定它位于OnCreateViewHolder
或OnBindViewHolder
方法的某个地方。
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
我在InnerAdapter
中setAdapter(innerAdapter);
创建了OnBindViewHolder
。是的,可能不是嵌套Recyclerviews的最佳场景,但我想了解泄漏的是什么?是什么导致这个?在分析器中,我发现所有OutterAdapter
值都是null
(正如我设置的那样),但OutterAdapter
有许多实例切换/销毁视图,其中应该只有1或无。 InnerAdapter
的x2计数通常为OutterAdapter
。我尝试了recyclerView.setAdapter(null)
父视图onDestroy()
方法,但它没有做任何事情,同样适用于将这些UI小部件归零的不同变体。
答案 0 :(得分:0)
您可以尝试LeakCanary,将其添加到您的应用中,只要发生内存泄漏,您就会收到通知。它还提供了可能导致它的原因的提示。
我的建议是使用snap helper和overflow indicator切换带有recyclerview的nersted view pager。