android - Android创建DatabaseAccess类的正确方法
问题描述
我有以下 DatabaseAccess.java 类,其中包含以下代码,以便实例化、打开、关闭和一些查询:
public class DatabaseAccess {
Context context;
private SQLiteOpenHelper openHelper;
private SQLiteDatabase database;
private static DatabaseAccess instance;
/**
* Private constructor to avoid object creation from outside classes.
*
* @param context
*/
private DatabaseAccess(Context context) {
this.context = context;
this.openHelper = new DatabaseHelper(context);
}
/**
* Return a singleton instance of DatabaseAccess.
*
* @param context the Context
* @return the instance of DabaseAccess
*/
public static DatabaseAccess getInstance(Context context) {
if (instance == null) {
instance = new DatabaseAccess(context);
}
return instance;
}
/**
* Open the database connection.
*/
public void open() {
this.database = openHelper.getWritableDatabase();
}
/**
* Close the database connection.
*/
public void close() {
if (database != null) {
this.database.close();
}
}
但是,我收到了一个严重的 SONAR 警告:
不要将 Android 上下文类放在静态字段中(对具有指向 Context 的字段上下文的 DatabaseAccess 的静态引用);这是内存泄漏
在我的应用程序中,每次我需要使用 databaseAccess 实例时,我都会在 onViewCreated() 上执行以下操作
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
databaseAccess = DatabaseAccess.getInstance(getContext());
}
我真的很困惑,我该如何解决这个内存泄漏?
解决方案
首先像这样为您的项目创建一个应用程序类。
<application android:name="com.xyz.YourApplicataionClassName">
</application>
然后在这个应用程序类中,为您的上下文创建一个静态 getter 方法。在需要上下文的地方调用此方法。
public class YourApplicataionClassName extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
YourApplicataionClassName.context = getApplicationContext();
}
public static Context getAppContext() {
return YourApplicataionClassName.context;
}
}
调用 YourApplicataionClassName.getAppContext() 方法,这将返回您的上下文。
但是,使用房间持久性库是比执行所有这些操作更好的方法
推荐阅读
- javascript - 关于使用扩展和字符串操作,foreach 循环的一点说明
- c++ - 一个使用链表 C++ 的简单工资系统
- ssl - 如何在 Digital Ocean OpenLiteSpeed 服务器上删除或编辑 SSL 证书
- python - 在 Qtext 编辑中格式化文本
- java - 无法添加或更新子行:尝试保存实体及其关系实体时出现外键约束失败错误
- mysql - 如何从 tar 文件中使用 TokuDB 安装 Percona 5.7
- cmake - CMake 找不到通过 Homebrew 安装的 Open MPI
- java - 具有相同状态的两个对象未从 HashMap 检索相同的值
- java - Break on exception in Java for "just my code"
- r - 根据 R 中的两个标准查找相应的值