【发布时间】: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