我使用GcmNetworkManager安排一个OneoffTask与执行窗口从0开始在documentations它提到强制执行
注意,您可以申请一次性的任务是在未来任何时候都会执行,但为了防止滥用,调度程序将仅在将来至少30秒内设置警报。如果发生某个网络事件以唤醒调度程序,则您的任务仍可以早于此运行。
这对我来说是有问题的,因为我必须等待30秒才能执行任务,而如果可能,我希望它立即执行。有什么办法可以做到这一点?
我使用GcmNetworkManager安排一个OneoffTask与执行窗口从0开始在documentations它提到强制执行
注意,您可以申请一次性的任务是在未来任何时候都会执行,但为了防止滥用,调度程序将仅在将来至少30秒内设置警报。如果发生某个网络事件以唤醒调度程序,则您的任务仍可以早于此运行。
这对我来说是有问题的,因为我必须等待30秒才能执行任务,而如果可能,我希望它立即执行。有什么办法可以做到这一点?
您的意思是说您想强制执行以调试OneoffTask?
当前您无法触发先前计划的任务。然而,有一个adb shell命令,您可以运行该命令以使用特定标记触发特殊的oneoff调试任务。 documentation on GcmNetworkManager有具体细节。
或者你的意思是说你希望你的OneoffTask能够立即运行?
不幸的是,除非发生报警而不发生某些事件以唤醒网络管理器。 GNM目前的工作方式是客户端调用时间表(Task)被视为唤醒(或其他任何API调用)。
如果您安排了您的任务,然后在第二个“时间表”调用后不久安排另一个任务,可能会使GNM碰撞运行第一个。这是没有记录的,也不是API的一部分,可能会改变,所以我不建议用它来做除调试以外的任何事情。
有一种方法可以实现强制立即执行任何任务。
尽管下面的方法看起来可能是蹩脚的代码,但在使用GcmNetworkManager编写后台数据同步代码后,大多数开发人员希望在应用程序处于前景时重用相同的代码段。为什么任何应用程序都有一个GcmTskService和一个AsyncTask/IntentService,都调用同一个数据同步API端点?
我面临同样的问题,并取得使用以下代码一次性任务的立即执行snippet-
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && MY_ACTION.equals(intent.getAction())) {
Log.v(LOG_TAG, "onStartCommand - called by our code);
if (network-is-connected)) {
// do below calls in run method of a thread
TaskParams taskParams = new TaskParams(TASK_TAG);
int result = onRunTask(taskParams);
if (result == GcmNetworkManager.RESULT_RESCHEDULE) {
// schedule task
}
stopSelf();
// thread's run end
} else {
// schedule task
stopSelf();
}
return START_NOT_STICKY;
} else {
Log.v(LOG_TAG, "onStartCommand - called by GCM Nw Mngr");
// call super so that GCM's code may run as it was intended
return super.onStartCommand(intent, flags, startId);
}
}