如何在扩展Application类的类中的静态方法中调用getApplicationContext
?
我想在AppContainer类中创建Database类,但我不知道从哪里获取Database构造函数的上下文。
数据库
public class Database extends SQLiteOpenHelper {
public Database(Context context) {
super(context, "database.db", null, 1);
}
}
AppContainer
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;
}
}
================== EDIT
我在代码中犯了错误。我忘了写字"静电"在getDatabase方法。错误已得到改善。我不想在我的代码中创建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;
}
}
答案 0 :(得分:1)
您可能不需要将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
对象可用之前,您不太可能想要访问数据库。
答案 1 :(得分:1)
尝试创建Context类型的静态变量并在构造函数中初始化它,因此在方法中创建所有静态变量。像这样:
public class AppContainer extends Application {
private static AppContainer instance;
private static Context ctx;
private static Database database;
public AppContainer() {
...
ctx=getApplicationContext();
}
...
public static Database getDatabase() {
....
Database database = new Database(ctx);
return database;
}
}
答案 2 :(得分:0)
您将在哪里创建AppContainer
对象?如果要在扩展为Activity
的类中创建该对象,则可以在创建此对象时传递上下文。基本上它看起来像这样:
public class AppContainer extends Application{
private Context c;
public AppContainer(Context context){
this.c = context;
}
.............
}
在扩展到Activity
的课程中:
public class theClass extends Activity{
AppContainer container = new AppContainer(this);
}