2015-07-06 129 views
4

我使用GcmNetworkManager安排一个OneoffTask与执行窗口从0开始在documentations它提到强制执行

注意,您可以申请一次性的任务是在未来任何时候都会执行,但为了防止滥用,调度程序将仅在将来至少30秒内设置警报。如果发生某个网络事件以唤醒调度程序,则您的任务仍可以早于此运行。

这对我来说是有问题的,因为我必须等待30秒才能执行任务,而如果可能,我希望它立即执行。有什么办法可以做到这一点?

回答

0

您的意思是说您想强制执行以调试OneoffTask?

当前您无法触发先前计划的任务。然而,有一个adb shell命令,您可以运行该命令以使用特定标记触发特殊的oneoff调试任务。 documentation on GcmNetworkManager有具体细节。

或者你的意思是说你希望你的OneoffTask能够立即运行?

不幸的是,除非发生报警而不发生某些事件以唤醒网络管理器。 GNM目前的工作方式是客户端调用时间表(Task)被视为唤醒(或其他任何API调用)。

如果您安排了您的任务,然后在第二个“时间表”调用后不久安排另一个任务,可能会使GNM碰撞运行第一个。这是没有记录的,也不是API的一部分,可能会改变,所以我不建议用它来做除调试以外的任何事情。

0

有一种方法可以实现强制立即执行任何任务。

尽管下面的方法看起来可能是蹩脚的代码,但在使用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); 
    } 
}