我正在使用GcmNetworkManager来安排OneoffTask,其执行窗口从0开始。在documentations中提及
请注意,您可以请求在将来的任何时间执行一次性任务,但为了防止滥用,调度程序将来只会在至少30秒内设置警报。如果发生某些网络事件以唤醒调度程序,您的任务仍可以比此更早运行。
这对我来说是有问题的,因为我必须等待30秒才能执行任务,而我希望它尽可能立即执行。有没有办法实现这个目标?
答案 0 :(得分:0)
您的意思是您希望能够强制执行以调试OneoffTask吗?
目前,您无法触发先前计划的任务。但是,您可以运行adb shell命令来触发具有特定标记的特殊oneoff调试任务。 documentation on GcmNetworkManager具有细节。
或者您的意思是您希望OneoffTask能够立即运行吗?
不幸的是,如果没有一个事件而不是警报来唤醒网络管理员,这是不可能的。 GNM目前的工作方式是客户端调用计划(任务)被视为唤醒(或任何其他API调用)。
如果你安排了你的任务,然后在第二个"计划"之后不久安排了另一个任务。调用可能会使GNM运行第一个。这是未记录的,不是API的一部分,可能会发生变化,因此我不建议使用它来执行除调试之外的任何操作。
答案 1 :(得分:0)
有一种方法可以强制立即执行任何任务。
虽然下面的方法乍一看似乎是错误的代码,但是在使用GcmNetworkManager编写后台数据同步代码之后,大多数开发人员都希望在应用程序处于前台时重用相同的代码。为什么任何应用程序都有一个GcmTskService和一个AsyncTask / IntentService,它们都调用相同的数据同步API端点?
我遇到了同样的问题,并使用下面的代码片段立即执行了一次性任务 -
@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);
}
}