Android 从BroadcastReceiver接收数据后执行数据库操作
我使用的是Android 从BroadcastReceiver接收数据后执行数据库操作,android,android-asynctask,broadcastreceiver,android-sqlite,Android,Android Asynctask,Broadcastreceiver,Android Sqlite,我使用的是BroadcastReceiver,它以固定的时间间隔获取数据流,然后根据这些数据,我执行某些数据库操作,将这些数据插入到各个表中 问题是,尽管您可以在BroadcastReceiver中执行数据库操作,但接收器可以随时返回。此外,我喜欢在异步任务中执行此类数据库操作 但由于从BroadcastReceiver启动AsyncTask仍然不是一个好的做法,因为如果onReceive()返回并且没有其他活动组件运行,Android可能会终止您的进程,所以我只能使用服务(AFAIK)来完成与
BroadcastReceiver
,它以固定的时间间隔获取数据流,然后根据这些数据,我执行某些数据库操作,将这些数据插入到各个表中
问题是,尽管您可以在BroadcastReceiver
中执行数据库操作,但接收器可以随时返回。此外,我喜欢在异步任务中执行此类数据库操作
但由于从BroadcastReceiver
启动AsyncTask
仍然不是一个好的做法,因为如果onReceive()
返回并且没有其他活动组件运行,Android可能会终止您的进程,所以我只能使用服务
(AFAIK)来完成与数据库相关的工作。此服务应该管理异步任务
。通过这种方式,Android将了解活动组件,并且不会终止进程
- 对于给定场景,这是最好的方法吗
就是-
BroadcastReceiver==>服务=>异步任务=>SQLITE(插入)
如果是这样,那么用IntentService
代替Service
怎么样
- 如果我在BroadcastReceiver本身中执行数据库操作呢
我有一个来自SQLiteOpenHelper
类的单例适配器,因此我可以使用将从BroadcastReceiver
的onReceive()
接收的上下文来使用适配器进行数据库操作。
但这种方法似乎效率低下
请建议..为什么不尝试ExecutorService而不是AsyncTask?
看看:
对于给定场景,这是最好的方法吗
我会使用IntentService
而不是服务
和异步任务
。AsyncTask
仅在您有需要在主应用程序线程上完成的工作时使用,并且服务不应该有需要在主应用程序线程上完成的工作
除此之外,让清单注册BroadcastReceiver
将工作委托给服务是一种典型的方法
如果我在BroadcastReceiver本身中执行数据库操作呢
如果您的UI恰好位于前台,则在执行onReceive()
时,它将被冻结
如果你花几秒钟来做这项工作,你会得到相当于一个ANR的背景,你的工作将被打断而无法完成
因此,我建议使用IntentService
,但正如我所知,IntentService
本身就是一个AsyncTask
,所以我可以对IntentService的onHandleIntent()
执行数据库操作吗?@VedPrakash:“但我知道IntentService本身就是一个异步任务”——不,不是。“那么我可以在IntentService的onHandleIntent()上执行数据库操作吗?”--是的。那么您的意思是将在onHandleIntent()上执行的数据库操作将不会是AsyncTask
操作吗?@VedPrakash:onHandleIntent()
在后台线程上调用。该线程不是使用AsyncTask
实现的。我正在广播接收器中在各种条件下执行数据库操作。那么,在广播接收机内部多次调用IntentService
是否会有问题?