2015-07-06 128 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); 
    } 
}