静态对象在BroadCastReceiver执行中有单独的实例吗?

时间:2017-09-04 16:49:39

标签: android

我有一个SQLiteOpenHelper实现的静态单例实例。

public class MyDbHelper extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 5;
    public static final String DATABASE_NAME = "myapp.db";

    public static SQL_CREATE_MY_TABLE ="some correct table creation sql";      
    public static SQL_DELETE_MY_TABLE="some correct table delete sql";
    ...


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

    public void onCreate(SQLiteDatabase db) {
      db.execSQL(SQL_CREATE_MY_TABLE);
      db.execSQL(SQL_CREATE_OTHER_TABLE);       
    }

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

      db.execSQL(SQL_DELETE_MY_TABLE);
      db.execSQL(SQL_DELETE_OTHER_TABLE);          
      onCreate(db);

   }
}

我在帮助器上有另一个包装器:

 public class MyAppDb {

    private static MyDbHelper mydbHelper;

    public static MyDbHelper getDbHelper(){
        if(null == mydbHelper){
            mydbHelper= new MyDbHelper(ctx);
            return mydbHelper;
        }else{
            return mydbHelper;
        }
    }
}

我在我的主要Ui代码(在不同的地方)使用来自此getDbHelper()的mydbHelper,以及每隔5分钟执行一次的Alarmmanager的BroadcastReceiver,以及在另一个系统BroadcastReceiver中使用。

样本用法:

SQLiteDatabase db = MyAppDb.getDbHelper().getReadableDatabase(); 

间歇性地,我从上面的mydbHelper获取了数据库实现的SQLiteDatabaseLockedException和SQLiteException。 好像虽然是静态的,但MyDbHelper有两个不同的实例同时出现。

发生了什么事?静态对象是否可以从BroadCastReceiver创建单独的实例?
或者我做错了?

0 个答案:

没有答案