android - 从 BroadcastReceiver 接收数据后进行数据库操作

标签 android android-asynctask broadcastreceiver android-sqlite

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

问题在于,虽然您可以在 BroadcastReceiver 中进行数据库操作,但接收方可以随时返回。此外,我喜欢在 AsyncTask 中执行此类数据库操作。

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

  • 这是针对给定场景的最佳方法吗?

那就是-

BroadcastReceiver ==> 服务 ==> AsyncTask ==> SQLITE(插入)

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

  • 如果我在 BroadcastReceiver 本身中进行数据库操作会怎样?

我有一个来自 SQLiteOpenHelper 类的单例适配器,所以我可以使用我将从 onReceive() 接收的 context >BroadcastReceiver 使用适配器进行数据库操作。 但这种方法似乎效率低下。

请建议..

最佳答案

Is this the best approach to do so for the given scenario ?

我会使用 IntentService 而不是带有 AsyncTaskServiceAsyncTask 仅在您有需要在主应用程序线程上完成的工作时使用,而服务不应该有需要在主应用程序线程上完成的工作。

除此之外,让 list 注册的 BroadcastReceiver 将工作委托(delegate)给 Service 是一种典型的方法。

What if I do database operations in BroadcastReceiver itself ?

如果您的 UI 恰好在前台,它会在 onReceive() 执行时被卡住。

如果您花几秒钟来完成这项工作,您将获得相当于 ANR 的背景,并且您的工作将被中断而无法完成。

因此,我建议使用 IntentService

关于android - 从 BroadcastReceiver 接收数据后进行数据库操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25807561/

相关文章:

java - 无法在 Android 中从 URL 加载照片

java - android 进度条无法正确更新进度(onPostExecute() 运行较晚)

java - Android 使用 Ksoap 作为 AsyncTask 解析变量并获取返回值

android - BroadcastReceiver 不起作用?

android - Gson反序列化JSON不同类型(ANDROID)

php - 如何让php添加utf8字符

java - WBXML 解析器/解码器

android - 不允许后台执行。 Android O 待定 Intent

带有广播接收器的 Android Alarm Manager 在代码中而不是 list 中注册

java - 加载图像 libgdx