我正在使用BroadcastReceiver
定期获取数据流,然后根据该数据我正在执行某些数据库操作以将数据插入到各种表中。
问题是尽管你可以在BroadcastReceiver
内进行数据库操作,但接收者可以随时返回。更重要的是,我喜欢在AsyncTask
中进行此类数据库操作。
但是因为从AsyncTask
启动BroadcastReceiver
仍然不是一个好习惯,因为如果onReceive()
返回并且没有其他活动组件在运行,Android可能会终止您的进程,所以我留下了Service
(AFAIK)做数据库相关的工作。此服务应管理AsyncTask
。这样Android就会知道活动组件,Android不会杀死进程。
即 -
BroadcastReceiver ==&gt; 服务 ==&gt; AsyncTask < strong> ==&gt; SQLITE(INSERT)
如果是这样,那么IntentService
而不是Service
呢?
我有SQLiteOpenHelper
类的单例适配器,因此我可以使用context
从onReceive()
BroadcastReceiver
获得的{{1}}来使用适配器进行数据库操作。
但这种方法似乎效率低下。
请建议..
答案 0 :(得分:1)
对于给定的场景,这是最好的方法吗?
我会使用IntentService
而不是Service
和AsyncTask
。仅当您需要在主应用程序线程上完成工作时才使用AsyncTask
,并且服务不应该具有需要在主应用程序线程上完成的工作。
除此之外,拥有一个清单注册的BroadcastReceiver
委托,工作到Service
是一种典型的方法。
如果我在BroadcastReceiver本身进行数据库操作怎么办?
如果您的UI恰好位于前台,则会在执行onReceive()
时冻结它。
如果您需要几秒钟的时间来完成工作,您将获得相当于ANR的背景,并且您的工作将在未完成的情况下中断。
因此,我建议使用IntentService
。
答案 1 :(得分:0)
为什么不尝试使用ExecutorService而不是AsyncTask? 看一下 : http://developer.android.com/reference/java/util/concurrent/ExecutorService.html http://developer.android.com/reference/java/util/concurrent/Executor.html