在什么Android活动状态应该打开和关闭数据库连接?

时间:2015-08-25 01:56:43

标签: android memory-leaks sqlite

我的商业应用程序几乎已经完成。它有8个列表活动和4个详细活动以及一系列其他好东西。

当我刚开始(并且是Android开发的新手)时,在我需要数据库连接的每个方法中,我创建了一个新的SQLiteOpenHelper子类实例和数据库连接,然后在方法结束时关闭了连接。这似乎做坏事。

使一切变得复杂,我需要在首次启动时安装我的数据。我有一个REST应用程序可以访问并缓存了一些数据。当我尝试加载其中一个表时,即使我在GSON中使用JSONReader类而不仅仅是常规的InputStreamReader功能,我似乎也会耗尽内存。因此,它应该一次读取一个对象。但是在具有< = 1 GB内存的模拟器上仍然会耗尽内存。

然后,我开始为SQLiteOpenHelper子类实例使用带有synchronized getter的单例。这样做,我是否仍然能够获取数据库连接对象并在我的方法中关闭它们?这似乎不起作用。

现在我经常使用SimpleCursorAdapter子类进行列表活动。这似乎可以解决一些问题,但不能解决问题或使情况变得更糟。

请参阅此活动图表及其运行时间:

http://developer.android.com/images/activity_lifecycle.png

看到这一点,我想我应该能够在onStart调用中创建数据库连接并关闭它,并在onStop调用中清空db连接对象。没有?当我使用SimpleCursorAdapter子类时,我在onStart调用中加载适配器并在onStop调用中将游标更改为null。这是错的吗?显然是。

我在类范围内使用db connection ivar进行了详细活动。我在onStart中打开数据库连接并在onStop中关闭它。那么,为什么我得到一个" java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase"我的onClick方法出错?在onStart和onStop调用之间调用onClick,是吗?那么到底是什么呢?

现在我有一个帮助方法,它将db连接实例作为参数进行检查并返回它,如果它是打开的,或者如果没有则返回一个新的打开实例。

那么,我是否需要在代码中每5或10行调用此方法?我不这么认为,但这就是感觉。我关闭onStop方法中的数据库连接对象。为什么这会成为问题?我应该不关闭任何东西吗?它会泄漏,但可能不会崩溃。但这似乎是错误的。哼。

我真的有多少个db连接对象?整个应用程序中只有一个?每个线程只有一个?其他一些数字?如何关闭它们以便它们不会泄漏而不会导致崩溃?

还有其他建议吗?

0 个答案:

没有答案