我有一项服务可以完成一些工作,完成后会发送广播。在活动中,接收者已注册并在其onReceive中接收广播。现在我需要从数据库中选择数据并在listview中显示它们。但我不想在ui线程上进行数据库选择,因为这可能是昂贵的操作,我想打开异步任务,但那又是接收器的生命周期。我还有什么其他解决方案?打开服务?是的我可以在新服务中执行数据库操作,但是如何将数据从服务传递到视图?从服务更新视图肯定是我不想做的事情。我现在处于一种死锁状态。
感谢您的任何想法
编辑1:这是android文档中的解释为什么你不能在onReceive中使用AsyncTask以及为什么答案无效
接收器生命周期 BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦你的代码从此返回 功能,系统认为要完成的对象不再 活性。 这对您在onReceive(Context,Intent)实现中可以做的事情产生了重要影响:任何需要的东西 异步操作不可用,因为您需要 从函数返回来处理异步操作,但是在 那一点,BroadcastReceiver不再是活动的,因此 系统可以在异步操作之前自由地终止其进程 完成。 特别是,您可能无法在BroadcastReceiver中显示对话框或绑定到服务。对于前者,你应该改为 使用NotificationManager API。对于后者,你可以使用 Context.startService()将命令发送到服务。
编辑2:答案引导我找到一个解决方案,在活动中创建一个处理程序并将其传递给接收者,在onReceive中只发布消息给处理程序然后在处理程序内部打开异步任务并执行数据库东西。不确定这是不是很好。
答案 0 :(得分:0)
我建议创建一个Interface
,将数据返回到Activity
,您可以在其中填充ListView
。我刚刚使用AsyncTask
创建了一个演示,其中我在AsyncTask
中执行数据库操作,并使用Activity
将数据发送到Interface
并更新UI。因此,您可以尝试将AsyncTask
替换为Service
并执行自己的操作。 Here is a sample demo source for Database Operation in AsyncTask and returning its content to Activity