2014-06-04 76 views
2

如何在擴展Application類的靜態方法中調用getApplicationContext如何在擴展Application類的類中的靜態方法中調用getApplicationContext?

我想在AppContainer類中創建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; 
    } 
} 

==================編輯

我在代碼所做的錯誤。我在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; 
} 
} 

回答

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); 
} 
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對象可用之前,您希望訪問數據庫的可能性非常小。

+0

當我們試圖通過調用提供這種方法來獲取上下文,這可能會失敗.. 的事情是,有沒有擔保的onCreate()Provider類之前調用​​應用類的onCreate() 。 通過存儲靜態上下文...和內存泄漏的機會...! –

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; 
} 

} 
相關問題