我正在尝试使用GCM网络管理器将日志发送到后端服务。我们大约每隔一小时运行一次警报,该警报会创建一个OneoffTask,该任务执行后将通过日志消息调用后端服务。

这行得通,但是丢失了很多任务(远远超过一半)。起初,我以为它与我们的后端或网络有关,但是在添加了大量文件日志之后,事实证明服务中的onRunTask永远不会为这些任务触发(但它们肯定是按计划进行的。为什么?这些丢失了吗?我误解了API,还是OneoffTasks根本不可靠?

这是安排OneoffTask的方式:

GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder()
    .setService(AvroLogService.class)
    .setExtras(bundle)

    // A mandatory tag which identifies the task
    // We add a unique hash to the tag to make sure that
    // tasks are logged and not thrown away as dupes.
    // See: http://stackoverflow.com/q/34528960/304262
    .setTag(java.util.UUID.randomUUID().toString())

    // Persist to disk, even across boots:
    .setPersisted(true)

    // Sets a time frame for the execution of this task in seconds.
    // This specifically means that the task can either be
    // executed right now, or at latest at a certain point:
    .setExecutionWindow(0, TWO_WEEKS_IN_SECONDS)
    .build());

再次,这不是有效的,而是仅消息的一部分。对于随后丢失的消息,上面的代码是
确实已执行(我已添加文件日志记录来验证这一点),但始终不会为丢失的文件触发相应的onRunTask。

我已验证:
  • list 是根据《网络管理器实现指南》(https://developers.google.com/cloud-messaging/network-manager)更新的。
  • AvroLogService(我的服务)扩展了GcmTaskService
  • 它覆盖onRunTask
  • 该应用程序具有RECEIVE_BOOT_COMPLETED权限。
  • AvroLogService不会覆盖onStartCommand。

  • 我迷路了。有人可以分享对此的见解吗?

    最佳答案

    作为执行时间范围以上的答案可能很大。我也认为您要定期执行事件,请尝试使用PeriodicTask.Builder而不是OneoffTask.Builder

    10-08 11:34