如何触发并忘记 Android 上的 SQLite 数据库插入?
How to fire and forget a SQLite database insert on Android?
情况是我有一个仅追加的日志数据库,并且定期向其中插入行。这工作快速而完美,但我很好奇 ...
由于这些记录并非绝对必要,因此将其实现为 即刻即忘 会很棒。但是,我也想保持它的轻量级,这让我觉得 AsyncTask
有点矫枉过正(用各种处理程序和同步生成一个新线程)。
您将如何实施?
更新:对于那些不熟悉"fire and forget"概念的人来说,它意味着尽可能快地执行任务而不阻塞并忽略结果。
好吧,任何磁盘 I/O 都需要在后台线程上完成,以免冻结您的 UI。所以,你有几个选择:
使用AsyncTask
,维护一个线程池
使用自己的线程池
使用单线程,完成后丢弃它们
使用IntentService
,如果您正在对这些记录进行批处理并将它们插入一个块中,这可能会很有用,因为这可能只需要足够长的时间就可以使服务变得有价值
无论您的线程模型如何,您都希望使用单例 SQLiteDatabase
,通常由单例包装 SQLiteOpenHelper
,以便为您处理线程间同步。
"lightweight" 的最佳选择不是更改数据库 I/O 本身,而是对记录进行批处理并将它们插入到单个事务中。这比在它们出现时插入它们要有效得多。然而,它增加了数据丢失的几率,因为当进程终止时,任何你没有坚持的东西都会poof。
情况是我有一个仅追加的日志数据库,并且定期向其中插入行。这工作快速而完美,但我很好奇 ...
由于这些记录并非绝对必要,因此将其实现为 即刻即忘 会很棒。但是,我也想保持它的轻量级,这让我觉得 AsyncTask
有点矫枉过正(用各种处理程序和同步生成一个新线程)。
您将如何实施?
更新:对于那些不熟悉"fire and forget"概念的人来说,它意味着尽可能快地执行任务而不阻塞并忽略结果。
好吧,任何磁盘 I/O 都需要在后台线程上完成,以免冻结您的 UI。所以,你有几个选择:
使用
AsyncTask
,维护一个线程池使用自己的线程池
使用单线程,完成后丢弃它们
使用
IntentService
,如果您正在对这些记录进行批处理并将它们插入一个块中,这可能会很有用,因为这可能只需要足够长的时间就可以使服务变得有价值
无论您的线程模型如何,您都希望使用单例 SQLiteDatabase
,通常由单例包装 SQLiteOpenHelper
,以便为您处理线程间同步。
"lightweight" 的最佳选择不是更改数据库 I/O 本身,而是对记录进行批处理并将它们插入到单个事务中。这比在它们出现时插入它们要有效得多。然而,它增加了数据丢失的几率,因为当进程终止时,任何你没有坚持的东西都会poof。