活动实例泄漏内存

时间:2017-10-17 12:11:59

标签: android android-fragments memory-leaks leakcanary

我用片段实现活动。在每个片段中,我都实现了RecyclerView。在每隔第n行的RecyclerView中,我附加了已经持有视图的My singleton类的静态视图。在onDestroy活动中,我从GridLayoutManager中删除所有视图,并从RecyclerView中删除所有视图并清除适配器对象。完成所有操作后,我也清除了我的单例类中的静态视图。但LeakCanary检测到该特定行的活动内存泄漏。如何避免内存泄漏以及如何删除任何持有静态上下文的视图?

    int adPosition = FacebookAdCenter.getInstance().getAdPosition(position);
        View adView;
        if (adPosition >= 0) {
            adView = FacebookAdCenter.getInstance().getNativeAdViewWithAdPosition(adPosition);
        } else {
            adView = null;
        }
        if (adView == null) {
            adView = FacebookAdCenter.getInstance().getNativeAdView(position);
            if (adView.getParent() != null) {
                ((ViewGroup) adView.getParent()).removeView(adView);
            }
            itemView.addView(adView);
        } else {
            if (adView.getParent() != null) {
                ((ViewGroup) adView.getParent()).removeView(adView);
            }
            itemView.addView(adView);
        }

实际上我想缓存Facebook广告,以便在一小时内重复使用它们。但不幸的是,我仍然没有成功。如果我使用静态引用来存储广告,那么就会出现内存泄漏。我不知道其他方法可以正确缓存Facebook广告。

1 个答案:

答案 0 :(得分:0)

  

在每个第n个项目行视图后的RecyclerView中,我附加了已经持有视图的My singleton类的静态视图。

不要这样做。

  

如何避免内存泄漏

不要引用static字段中的观看次数。

在Java中,可变static字段(即非常量)是代码气味。在Android中,我们可以容忍它们,但它们主要用于缓存或调解组件之间的通信。组件(活动)之间无法重用View