Принудительное выполнение GCMNetworkManager OneoffTask в Android

Я использую GcmNetworkManager для планирования OneoffTask с окнами выполнения, начиная с 0. В документах он упоминает

Обратите внимание, что вы можете запросить одноразовую задачу, которая будет выполнена в любой момент в будущем, но чтобы предотвратить злоупотребление, планировщик установит будильник как минимум на 30 секунд в будущем. Ваша задача все еще может быть запущена раньше, чем при возникновении какого-либо сетевого события, чтобы разбудить планировщик.

Это проблематично для меня, так как я должен ждать 30 секунд для выполнения задачи, тогда как я хочу, чтобы она была выполнена немедленно, если это возможно. Есть ли способ достичь этого?

Вы хотите, чтобы вы могли принудительно выполнить выполнение, чтобы отладить ваш OneoffTask?

В настоящее время вы не можете запустить ранее запланированную задачу. Однако есть команда adb shell, которую вы можете запустить, чтобы запустить специальную задачу отладки oneoff с определенным тегом. Спецификация GcmNetworkManager имеет документацию .

Или вы хотите сказать, что хотите, чтобы OneoffTask мог работать сразу?

К сожалению, это невозможно без какого-либо события, кроме тревоги, имеющей место для пробуждения сетевого менеджера. Способ, которым GNM работает в настоящее время, заключается в том, что расписание клиентского вызова (Task) считается пробуждением (или любым другим вызовом API, если на то пошло).

Если вы запланировали свою задачу, а затем запланировали другую, вскоре после второго вызова «расписание», вероятно, столкнется с GNM в первом запуске. Это недокументировано, а не часть API и, скорее всего, изменится, поэтому я не рекомендую использовать его для чего-либо другого, кроме как для отладки.

Существует способ добиться немедленного выполнения любой задачи.

Хотя подход ниже может показаться плохим кодом на первый взгляд, но после написания кода для синхронизации фоновых данных с использованием 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); } }