【问题标题】:Warning - Memory Leak - Context classes in static fields警告 - 内存泄漏 - 静态字段中的上下文类
【发布时间】:2018-04-02 14:46:41
【问题描述】:

我正在尝试从 Codelabs 实现架构组件。但我收到以下错误

不要将 Android 上下文类放在静态字段中(静态 对具有字段 mContext 指向的 FarmerNetworkDataSource 的引用 上下文);这是内存泄漏(也破坏了即时运行) 少...

我直接使用了来自 Google Codelabs 的代码 sn-p。你可以refer it here

我见过一些duplicate questions。但我不知道哪个是最好的做法。

请帮助和指导我...

代码

public class FarmerNetworkDataSource {

    // For Singleton instantiation
    private static final Object LOCK = new Object();
    private static FarmerNetworkDataSource sInstance;
    private final Context mContext;

    private final AppExecutors mExecutors;

    private FarmerNetworkDataSource(Context context, AppExecutors executors) {
        mContext = context;
        mExecutors = executors;
    }

    /**
     * Get the singleton for this class
     */
    public static FarmerNetworkDataSource getInstance(Context context, AppExecutors executors) {
        Log.d(LOG_TAG, "Getting the network data source");
        if (sInstance == null) {
            synchronized (LOCK) {
                sInstance = new FarmerNetworkDataSource(context.getApplicationContext(), executors);
                Log.d(LOG_TAG, "Made new network data source");
            }
        }
        return sInstance;
    }
}

存储库

public static FarmerRepository provideRepository(Context context) {
        AppExecutors executors = AppExecutors.getInstance();
        FarmerNetworkDataSource networkDataSource =
                FarmerNetworkDataSource.getInstance(context.getApplicationContext(), executors);
        return FarmerRepository.getInstance(networkDataSource, executors);
    }

【问题讨论】:

  • 从你有WeatherNetworkDataSource networkDataSource = WeatherNetworkDataSource.getInstance(context.getApplicationContext(), executors);的github存储库中查看源代码你传递给FarmerNetworkDataSource的构造函数的上下文不应该比活动生命周期长
  • @Raghunandan 我已经添加了创建数据源的代码
  • 我下载了 repo 并在其上运行 lint。如果您使用的是应用程序上下文,则无需担心,providerRepository 中使用了什么上下文
  • 它是您看到的 lint 警告。您链接到的存储库代码中没有泄漏。您可以使用泄漏金丝雀github.com/square/leakcanary 并在您的代码中查找内存泄漏
  • 这不是错误,而是警告!我们是程序员,我们无视警告!

标签: java android memory-leaks


【解决方案1】:

我的方法是:

private static WeakReference<Context> appContext;

public static Context getAppContext() {
    if (appContext == null)
        return null;
    return appContext.get();
}

WeakReference 影响垃圾收集器。大多数对象是 引用必须保存在内存中,直到它们无法访问。但随着 WeakReference,被引用的对象可以被收集。

我在几个项目中使用了它,事实证明它非常方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2021-06-04
    • 2012-08-08
    • 2011-10-23
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多