以时间敏感的方式为广播接收器加载数据

时间:2014-05-01 02:18:52

标签: android android-sqlite android-contentprovider android-broadcast

我正在通过BroadcastReceiver收听广播。我的要求的本质是我需要以非常时间敏感的方式从SQLite DB加载一些相当大的数据。我需要快速的数据。这是我在BroadcastReceiver.onReceive点击之前预先加载和准备数据的理想方式。

这是一个理想的方法吗?

2 个答案:

答案 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数据库访问的当前速度,它可以正常工作。