从BroadcastReceiver接收数据后执行数据库操作

时间:2014-09-12 11:43:53

标签: android android-asynctask broadcastreceiver android-sqlite

我正在使用BroadcastReceiver定期获取数据流,然后根据该数据我正在执行某些数据库操作以将数据插入到各种表中。

问题是尽管你可以在BroadcastReceiver内进行数据库操作,但接收者可以随时返回。更重要的是,我喜欢在AsyncTask中进行此类数据库操作。

但是因为从AsyncTask启动BroadcastReceiver仍然不是一个好习惯,因为如果onReceive()返回并且没有其他活动组件在运行,Android可能会终止您的进程,所以我留下了Service(AFAIK)做数据库相关的工作。此服务应管理AsyncTask。这样Android就会知道活动组件,Android不会杀死进程。

  • 对于给定的方案,这是最好的方法吗?

即 -

BroadcastReceiver ==&gt; 服务 ==&gt; AsyncTask < strong> ==&gt; SQLITE(INSERT)

如果是这样,那么IntentService而不是Service呢?

  • 如果我在BroadcastReceiver本身进行数据库操作怎么办?

我有SQLiteOpenHelper类的单例适配器,因此我可以使用contextonReceive() BroadcastReceiver获得的{{1}}来使用适配器进行数据库操作。 但这种方法似乎效率低下。

请建议..

2 个答案:

答案 0 :(得分:1)

  

对于给定的场景,这是最好的方法吗?

我会使用IntentService而不是ServiceAsyncTask。仅当您需要在主应用程序线程上完成工作时才使用AsyncTask,并且服务不应该具有需要在主应用程序线程上完成的工作。

除此之外,拥有一个清单注册的BroadcastReceiver委托,工作到Service是一种典型的方法。

  

如果我在BroadcastReceiver本身进行数据库操作怎么办?

如果您的UI恰好位于前台,则会在执行onReceive()时冻结它。

如果您需要几秒钟的时间来完成工作,您将获得相当于ANR的背景,并且您的工作将在未完成的情况下中断。

因此,我建议使用IntentService

答案 1 :(得分:0)