我正在通过BroadcastReceiver
收听广播。我的要求的本质是我需要以非常时间敏感的方式从SQLite DB加载一些相当大的数据。我需要快速的数据。这是我在BroadcastReceiver.onReceive
点击之前预先加载和准备数据的理想方式。
这是一个理想的方法吗?
答案 0 :(得分:1)
不包括static
代码,在onReceive
调用之前,您无法在BroadcastReceiver中执行任何操作。你唯一能做的就是覆盖默认的(无参数)构造函数,但是由于你没有有效的Context
来访问和打开你的数据库,所以它不会帮助你( Context
作为参数传递给onReceive
)。
如果您想要做的工作太长而无法在BroadcastReceiver中完成,那么您的接收器需要启动一个服务并在那里完成工作。如果您不希望服务保持活跃,您可以使用IntentService
,它将管理自己的生命周期,并在完成onHandleIntent
中完成的任何工作后自行停止。
<强>广播接收器强>:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
intent.setClassName(context, MyService.class);
context.startService(intent);
}
}
<强>服务强>:
public class MyService extends IntentService {
private static final String TAG = "MyService";
// default constructor is required for all application components
public MyService() {
super(TAG);
}
@Override
public void onHandleIntent() {
// do your work here
}
}
答案 1 :(得分:0)
这是我采取的方法:
问题是数据延迟。我创建了另一个表,其中包含每个源表中最小的列集,这些表对BroadcastReceiver
启动时(或者反过来启动Service
)的处理非常重要。
这个新表旨在保持我需要的所有表之间的连接的笛卡尔积,直到我用来搜索的列的粒度(where
子句)。此表通过管理Service
的{{1}}重新创建。该线程处理所有数据并“摘要”它,以便应用程序以最简单的方式处理它。它将消化的数据保存到表中。我没有使用Thread
,因为没有办法阻止正在运行的工作线程。
我现在所做的就是在IntentService
启动时查询数据库,并从SQLite数据库获取我想要的绝对行并进行处理。由于应用程序可以轻松地开始处理它已经简化了,因此处理时间没有其他开销。我们得到结果后立即开始业务。
这仍然是我想象最终方法的最完美方式,但考虑到SQLite数据库访问的当前速度,它可以正常工作。