如何在扩展Application类的类中的静态方法中调用getApplicationContext
?
我想在 AppContainer 类中创建数据库类,但我不知道从哪里获取数据库构造函数的上下文。
数据库
public class Database extends SQLiteOpenHelper {
public Database(Context context) {
super(context, "database.db", null, 1);
}
}
应用程序容器
public class AppContainer extends Application{
// Problem---------|
private static class DatabaseHolder { // v
public static final Database DATABASE = new Database(getApplicationContext());
}
public static Database getDatabase()
{
return DatabaseHolder.DATABASE;
}
}
==================编辑
我的代码出错了。我忘记在 getDatabase 方法中写上“static”一词。错误已得到改善。我不想在我的代码中创建 AppContainer。我想使用此类作为具有静态字段的容器,并在不创建 AppContainer 实例的情况下获取它们。
我找到了问题的解决方案:
public class AppContainer extends Application {
private static AppContainer instance;
private static Database database;
public AppContainer() {
instance = this;
}
public static AppContainer getInstance() {
if (instance == null)
synchronized (AppContainer.class) {
if (instance == null)
instance = new AppContainer();
}
return instance;
}
public static Database getDatabase() {
if (database == null)
synchronized (AppContainer.class) {
if (database == null)
database = new Database(getInstance().getApplicationContext());
}
return database;
}
}
最佳答案
您可能不需要将Database
对象初始化为AppContainer
的一部分。
特别是因为你的方法
public Database getDatabase()
{
return DatabaseHolder.DATABASE;
}
不是静态的,除非Application
对象完全初始化,否则无法调用它。因此,您不需要对它的静态引用 - 将其作为普通实例成员并在构造函数中初始化它就足够了。
public class AppContainer extends Application
{
private Database mDatabase;
public AppContainer()
{
super();
mDatabase = new Database(this);
}
public Database getDatabase()
{
return mDatabase;
}
}
但是,如果您需要将 getDatabase()
方法设置为静态,则将 mDatabase
实例字段更改为静态字段,然后保持其余部分相同可能就足够了。在 Application
对象可用之前,您不太可能想要访问数据库。
关于java - 如何在扩展Application类的类中的静态方法中调用getApplicationContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047733/