我需要一些建议如何在Android和Java中实现。我有一个包含50多个活动的大项目,我使用两个不同的数据库类来查询sqlite语句并从我的系统和用户数据库中检索信息。以下是我使用和初始化数据库的示例:
SystemDatabaseHelper dbHelper = new SystemDatabaseHelper(this, null, 1);
dbHelper.initialize(this);
我在活动中这样做,最近几天我读了大量关于android中的内存泄漏以及关于将Context
提供给非活动类的全部信息以及这可能导致的泄漏。我的问题是哪个是创建某个类并仅从主要活动初始化它的最佳方法,而不是在所有其他活动中使用它而不是一次又一次地初始化它。
任何建议都是实现这一目标的最佳方式......我有一些想法,但希望听到您的建议和最佳实践。
答案 0 :(得分:2)
如果您只是在寻找单身人士时尝试初始化数据库帮助程序类?这是一个如何制作它的例子
public class ContactDBHelper extends SQLiteOpenHelper {
private ContactDBHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
private static ContactDBHelper mInstance;
public static synchronized ContactDBHelper getInstance() {
if (mInstance == null) {
mInstance = new ContactDBHelper(Util.getApplicationContext(),
ContactDB.DB_NAME, null, ContactDB.DB_VERSION);
}
return mInstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(ContactDB.Contact.CREATE_STMT);
db.execSQL(ContactDB.Contact.CREATE_PHONE_NUMBER_INDEX);
db.execSQL(ContactDB.Contact.CREATE_REVERSE_PHONE_NUMBER_INDEX);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
如果你第一次调用ContactDBHelper.getInstance();
,它会初始化实例,之后任何应用程序组件或任何方法都会调用它,它不会初始化它将返回单例初始化实例。
注意:对于Util.getApplicationContext,它是一个静态帮助器方法,它返回在主Activity中设置的应用程序上下文。
对于内存泄漏,您可以使用WeakReference
或SoftRerference
这是Util类
public class Util {
private static WeakReference<Context> applicationContext;
public static Context getApplicationContext() {
return applicationContext.get();
}
public static void setApplicationContext(Context context) {
applicationContext = new WeakReference<Context>(context);
}
}
答案 1 :(得分:1)
您可以扩展应用程序类并使用单个全局引用。这也具有不使用Activity上下文的优点。
public class NameOfApp extends Application {
public static SQLiteDatabase db;
@Override
public void onCreate() {
super.onCreate();
try{
// this will create the database if required (e.g. new install or db deleted)
db=new Database(this.getBaseContext()).getWritableDatabase();
} catch (Exception e) {
// TODO add alert and quit
Log.e(TAG,"Error creating DB:" + e.getMessage());
Toast.makeText(getApplicationContext(), "Error creating DB:" + e.getMessage(), Toast.LENGTH_LONG).show();
}
} // onCreate
@Override
public void onTerminate(){
Log.d(TAG, "Application.onTerminate() database closed");
super.onTerminate();
savePreferences();
db.close();
}
public void closeDB(){
db.close();
Log.d(TAG,"Database closed on request");
}
protected SQLiteDatabase getwritableDatabase(){
return db;
}
}
使用MyAppName.getWritableDatabase()。