我使用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);
}
}