2016-02-09 45 views
10

我有一個應用程序SyncAdapter。此外,對於正常的同步我觸發USER_READ事件與我傳遞一個Bundle到適配器不堅持它:Bundles通過SyncManager持續多久?

Bundle settingsBundle = new Bundle(); 
settingsBundle.putString(SyncAdapter.USER_READ, uid); 
ContentResolver.requestSync(account, authority, settingsBundle); 

這將正確的某個時候打電話給我的同步程序的未來。在Bundle中設置的每個uid都將觸發其自己的運行,並且所有內容都按預期進行同步。

如果現在接觸不良,或請求超時,然後我設置的軟錯誤:

syncResult.stats.numIoExceptions += 1; 

,這將導致請求被多次重複。這也工作得很好。


多久這些SyncRequests /捆綁得到持續?

該文檔指出,遇到軟錯誤將導致指數退避,同步將在一段時間後運行。

  • 它會在某個時候被取消嗎?經過多次軟錯誤?
  • 重新啓動設備後會再次入隊嗎?

由於接觸不良而同步將失敗與軟錯誤多次:我想知道,如果只是排隊同步的要求是不夠的,或者如果我必須提供某種持久的自己,以確保請求是在某個時刻發送。

+0

這取決於您的要求,它會在系統發出一條網絡消息時,按照定期的時間間隔,在設備重新啓動後按需求閱讀http://developer.android.com/training/sync-adapters /running-sync-adapter.html –

+0

@WaqasAhmed謝謝,是的。我知道文檔。我只是想知道這些請求會持續多久,特別是如果我不只是使用*完全同步*,但需要捆綁的數據 –

回答

7

我不得不在Android運行時間源中挖掘一點點來找到你的問題的答案。我們從問題的第一部分開始。

Will it [sync] be canceled at some point? After multiple soft errors?

而答案可能是否定的,直到下列條件之一滿足:

  • 同步取消
  • 你問SyncManager不重新安排同步通過ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY
  • 開始SyncAdapter您將SyncResult.tooManyRetries設置爲true並且同步不是僅上載
  • 您設置SyncResult.tooManyDeletionstrue,不設置SyncStats.numInsertsSyncStats.numUpdates非空值,並且同步是不是僅上載
  • 同步沒有軟錯誤,但有一些硬錯誤,並且它不是僅上載
  • 同步運行對於超過30分鐘
  • 同步不使用網絡超過1分鐘

那麼多的軟錯誤不取消同步和這裏的原因。

處理所有同步事件開始於SyncManager.SyncHandler.handleMessage()方法並繼續在SyncManager.runSyncFinishedOrCanceledH()方法。 runSyncFinishedOrCanceledH()的第一個參數是SyncResult,其可以是null。當同步完成或SyncAdapter服務斷開連接時,這不是null,這是一個軟錯誤。當同步被取消,過期(超過30分鐘),超過1分鐘不使用網絡,並且在另一種情況下我不完全理解時,它是null

如果SyncResultnull與錯誤完成同步,SyncManager嘗試通過調用maybeRescheduleSync()重新安排同步。這種方法檢查一些標誌和同步結果,如ContentResolver.SYNC_EXTRAS_DO_NOT_RETRYSyncResult.tooManyRetries確定是否需要重新安排同步。並且在SyncManager檢查同步完成軟錯誤syncResult.hasSoftError()後,它會重新計劃同步,而不進行任何其他檢查。

現在問題的第二部分。

Will it [sync] be enqueued again after a reboot of the device?

是的,它會的。當SystemServer初始化時,它會創建ContentService,然後調用它的systemReady()方法,依次創建SyncManagerSyncManager在其構造函數中創建SyncStorageEngine,其中reads all pending operations在其構造函數including extra bundles中。這就是爲什麼同步包中允許的一組類型非常有限。當用戶開始時,所有掛起的操作都通過調用SyncQueue.addPendingOperations()添加到SynqQueue

此答案是我對Android代碼分析的結果,因此我無法保證它是100%正確的。但是,您可以將此信息用作您自己研究的起點。

+0

這是我尋找的那種答案,謝謝! –