【问题标题】:Activity instance leak memoryActivity 实例泄漏内存
【发布时间】:2018-03-29 03:03:58
【问题描述】:

我用片段实现活动。在每个片段中,我都实现了 RecyclerView。在每第 n 行之后的 RecyclerView 中,我从我的单例类中附加了静态视图,这些视图已经持有视图。在活动的 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 广告的方法。

【问题讨论】:

    标签: android android-fragments memory-leaks leakcanary


    【解决方案1】:

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

    不要这样做。

    如何避免内存泄漏

    不要引用来自static 字段的视图。

    总体而言,在 Java 中,可变的 static 字段(即,不是常量)是一种代码味道。在 Android 中,我们对它们的容忍度更高,但它们主要用于缓存或调解组件之间的通信。 View 不能在组件(活动)之间重用。

    【讨论】:

    • 如果我想在我的应用程序中保留一些数据半小时而不泄漏任何活动实例的内存,我该怎么办?
    • @WakilAhmad:坚持 data,而不是 UI 小部件、活动等。普通的旧 Java 对象 (POJO) 很好,除非有大小问题。
    • 我想持有facebook原生广告。这是正确的吗?如果没有,请告诉如何将原生广告缓存一个小时?
    • @WakilAhmad:我没有使用过 Facebook 的广告系统,所以我不知道缓存它们是否合适,更不用说安全这样做的规则了。对不起!
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多