上下文中的内存泄漏
Memory leaks in context
我有一个 class 应用程序,它扩展了应用程序并有一个静态方法 returns 上下文(它是静态的)。
public class App extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
DBHelper dbHelper = new DBHelper();
DatabaseManager.initializeInstance(dbHelper);
}
public static Context getContext() {
return context;
}
}
现在在构造函数中扩展 SQLiteAssetHelper 的 DBHelper class 中,我有这个:
public DBHelper() {
super(App.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
}
这是 DataBaseManager class:
public class DatabaseManager {
private Integer mOpenCounter = 0;
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
mOpenCounter+=1;
if(mOpenCounter == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
}
一切正常,但存在设计问题,因为上下文字段不应该是静态的。如何在保持代码正常工作和字段非静态的同时在 DBHelper 中使用上下文?
您可以像下面这样在 DBHelper 构造函数中传递 ApplicationContext:
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
然后是
DBHelper dbHelper = new DBHelper(getApplicationContext());
我有一个 class 应用程序,它扩展了应用程序并有一个静态方法 returns 上下文(它是静态的)。
public class App extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
DBHelper dbHelper = new DBHelper();
DatabaseManager.initializeInstance(dbHelper);
}
public static Context getContext() {
return context;
}
}
现在在构造函数中扩展 SQLiteAssetHelper 的 DBHelper class 中,我有这个:
public DBHelper() {
super(App.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
}
这是 DataBaseManager class:
public class DatabaseManager {
private Integer mOpenCounter = 0;
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
mOpenCounter+=1;
if(mOpenCounter == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
}
一切正常,但存在设计问题,因为上下文字段不应该是静态的。如何在保持代码正常工作和字段非静态的同时在 DBHelper 中使用上下文?
您可以像下面这样在 DBHelper 构造函数中传递 ApplicationContext:
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
然后是
DBHelper dbHelper = new DBHelper(getApplicationContext());