如何在类扩展Application类的静态方法中调用getApplicationContext?

时间:2014-06-04 21:17:19

标签: java android methods static

如何在扩展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;
}
}

3 个答案:

答案 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);
}