加载程序与广播接收程序的优先级始于主线程

时间:2018-08-23 17:11:27

标签: java android android-broadcastreceiver android-loadermanager android-loader

请考虑以下事件顺序:

  1. BroadcastReceiver的{​​{1}}方法中注册了onResume(没有处理程序)。
  2. 通过调用Activity方法来启动CursorLoader,作为restartLoader中的下一个即时语句(在 main 线程上调用onResume本身)

我的观察结果是,restartLoader方法总是在第一次调用onLoadFinished之前被调用。也就是说,onReceive优先于CursorLoader。此外,BroadcastReciever的{​​{1}}方法在onReceive方法完成之前不会被调用。

假设:

  1. 已经有一个前台服务在后台运行,该服务甚至在首次启动该应用程序之前为我的BroadcastReceiver发布消息 AND
  2. 考虑到onLoadFinished是在BroadcastReciever启动之前注册的,考虑到BroadcastReciever已经有可用消息,不应立即触发CursorLoader方法。

由于并非如此,因此我相信在活动的主线程上启动时,onReceive优先于BroadcastReceiver。但是,我似乎找不到任何文档。

如何确保我的CursorLoader优先于BroadcastReceiver?此行为很重要,因为我希望我的BroadcastReceiver被前台服务广播的一些信息初始化,即使该应用程序是新启动的(即在CursorLoader上调用onCreate)。 Activity需要此信息来创建ACtivity,以用于获取相关数据并将其显示在UI上。由于CursorLoaderUri之前运行,因此它会构造一个没有此信息的CursorLoader,然后从数据库中获取陈旧数据。

1 个答案:

答案 0 :(得分:0)

不推荐使用加载器,强烈建议重构以使用ViewModel。您还可以结合使用实时数据。

链接到ViewModel ViewModel Overview 链接到实时数据LiveData Overview