我的应用程序崩溃是因为我错误地实现了我的数据库单例吗?

时间:2016-05-04 16:46:44

标签: java android sqlite android-sqlite android-lifecycle

所以只要我正在使用手机,我的应用程序似乎工作得很好。我可以旋转屏幕,关闭应用程序,重新打开它,无论如何,没有问题。

但是,如果我按下主页/后退按钮并将应用程序发送到后台,然后如果我晚上睡觉,当我几小时后醒来并尝试再次打开应用程序时,它会立即崩溃。我不知道导致这个错误的是什么,但我认为它与NullPointerException(此时我存在的祸根)有关,因为Android决定释放一些内存。

我查阅了这个图表:

enter image description here

因此,当我将应用程序发送到后台时,它会转到onStop(),然后Android可能最终释放一些内存并终止进程,因此当我再次打开应用程序时,它会尝试调用{{ 1}},除了现在onCreate()崩溃。这对我没有意义。

我能想到的唯一另一个原因是我在我的应用程序中使用了onCreate()数据库单例,它以某种方式被Android占用内存消耗掉了。在我所有SQLite3onCreate()的{​​{1}}方法中,我通常会调用ActivitiesFragments通常为mDatabaseHelper = DatabaseHelper.getInstance(context);,如果我&#39} ; m在context中,或this如果我在Activity中)。

这是我的getActivity()课程:

Fragment

在我的启动器活动(DatabaseHelper)中,我这样做:

public class DatabaseHelper extends SQLiteOpenHelper {
    private static volatile SQLiteDatabase mDatabase;
    private static DatabaseHelper mInstance = null;
    private static Context mContext;

    //... various constant fields here ...

    public static synchronized DatabaseHelper getInstance(Context context){
        if (mInstance == null){
            mInstance = new DatabaseHelper(context.getApplicationContext());
        }
        return mInstance;
    }

    private DatabaseHelper(Context context){
        super(context, DB_NAME, null, DB_VERSION);
        mContext = context;
    }

    public void open() throws SQLException {
        mDatabase = getWritableDatabase();
    }

    public void close(){
        mDatabase.close();
    }

    //... other functions here ...
}

这是我唯一一次在整个应用中调用MainActivity。我从不在任何地方拨打public class MainActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); DatabaseHelper databaseHelper = DatabaseHelper.getInstance(this); databaseHelper.open(); Intent intent = new Intent(this, AnotherActivity.class); startActivity(intent); finish(); } }

这是否解释了导致我的应用崩溃的原因?由于我在open()方法中调用close()(在长时间闲置后恢复应用时会调用此方法),这使我怀疑该功能出现问题。 Android可以通过某种方式破坏"应用程序上下文"? getInstance()是否可能以某种方式设置为onCreate?我还需要做些什么才能确保我已正确实施此数据库?

1 个答案:

答案 0 :(得分:0)

这通常发生在Android中的单例模式中。你可以在这里阅读一下

Static singleton lifetime in Android

这在过去一直困扰着我。我可能会将您的open命令移动到getInstance方法中的if语句,以便在创建数据库后立即运行。这样一来,如果Android由于你的应用程序长时间闲置而清理内存,它将在下次返回时重新打开数据库。即:

core.js