Bissi singh
Bissi singh

Reputation: 50

Memory leaks in context

I have a class App which extends Application and has a static method which returns context(which is static).

public class  App extends Application {
    private  static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this.getApplicationContext();
        DBHelper dbHelper = new DBHelper();
        DatabaseManager.initializeInstance(dbHelper);

    }

    public static   Context getContext() {
        return context;
    }
}

Now in the DBHelper class which extends SQLiteAssetHelper in the constructor, i have this:

 public DBHelper() {
        super(App.getContext(), DATABASE_NAME, null, DATABASE_VERSION);

    }

This is the DataBaseManager class:

public class DatabaseManager {
    private Integer mOpenCounter = 0;

    private static DatabaseManager instance;
    private static SQLiteOpenHelper mDatabaseHelper;
    private SQLiteDatabase mDatabase;

    public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
        if (instance == null) {
            instance = new DatabaseManager();
            mDatabaseHelper = helper;
        }
    }

    public static synchronized DatabaseManager getInstance() {
        if (instance == null) {
            throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
                    " is not initialized, call initializeInstance(..) method first.");
        }

        return instance;
    }

    public synchronized SQLiteDatabase openDatabase() {
        mOpenCounter+=1;
        if(mOpenCounter == 1) {
            // Opening new database
            mDatabase = mDatabaseHelper.getWritableDatabase();
        }
        return mDatabase;
    }


}

Everything works fine, but there is a design problem because context fields should not be static. How do I use a context in DBHelper while keeping the code working and the field non-static?

Upvotes: 0

Views: 52

Answers (1)

Jainam Jhaveri
Jainam Jhaveri

Reputation: 1559

You can pass ApplicationContext inside the DBHelper constructor like below:

public DBHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
}

and then

DBHelper dbHelper = new DBHelper(getApplicationContext()); 

Upvotes: 2

Related Questions