所以只要我正在使用手机,我的应用程序似乎工作得很好。我可以旋转屏幕,关闭应用程序,重新打开它,无论如何,没有问题。
但是,如果我按下主页/后退按钮并将应用程序发送到后台,然后如果我晚上睡觉,当我几小时后醒来并尝试再次打开应用程序时,它会立即崩溃。我不知道导致这个错误的是什么,但我认为它与NullPointerException
(此时我存在的祸根)有关,因为Android决定释放一些内存。
我查阅了这个图表:
因此,当我将应用程序发送到后台时,它会转到onStop()
,然后Android可能最终释放一些内存并终止进程,因此当我再次打开应用程序时,它会尝试调用{{ 1}},除了现在onCreate()
崩溃。这对我没有意义。
我能想到的唯一另一个原因是我在我的应用程序中使用了onCreate()
数据库单例,它以某种方式被Android占用内存消耗掉了。在我所有SQLite3
和onCreate()
的{{1}}方法中,我通常会调用Activities
(Fragments
通常为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
?我还需要做些什么才能确保我已正确实施此数据库?
答案 0 :(得分:0)
这通常发生在Android中的单例模式中。你可以在这里阅读一下
Static singleton lifetime in Android
这在过去一直困扰着我。我可能会将您的open命令移动到getInstance方法中的if语句,以便在创建数据库后立即运行。这样一来,如果Android由于你的应用程序长时间闲置而清理内存,它将在下次返回时重新打开数据库。即:
core.js