【问题标题】:Accessing a database in a separate thread in Android在 Android 的单独线程中访问数据库
【发布时间】:2010-11-24 17:17:55
【问题描述】:

如何在Activity 的单独线程(即AsyncTask)中访问SQLiteDatabase 数据库,并确保始终将其置于合法状态?

如果我理解正确,线程可以随时终止,数据库可能保持打开状态,可能会给出IllegalStateException (SQLiteDatabase 在以后创建并且永远不会关闭)。

你是怎么处理的?

【问题讨论】:

    标签: android multithreading sqlite android-activity android-asynctask


    【解决方案1】:

    如果您的AsyncTask 由您的Activity 管理,那么Activity 可能会在适当的时候取消AsyncTask(当它容易被操作系统杀死时,例如在Activity.onPause() 之后)所以AsyncTask.onCancelled() 将在您可以关闭数据库的地方调用。

    如果您的AsyncTask(或Thread)不是由您的Activity 管理,那么您就有麻烦了,应该考虑重新设计您的架构。

    【讨论】:

      【解决方案2】:

      两种方式:

      1. 您可以注册Runtime.addShutdownHook(..) 并在那里关闭数据库。

      2. 创建自定义 Application 并在您关闭数据库的位置实现 onLowMemory()

      【讨论】:

      • 有没有保证addShutdownHook在所有activity都被销毁后会一直运行?
      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 2014-12-27
      • 1970-01-01
      • 2011-11-21
      • 2012-07-04
      • 2016-08-24
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多