Dav*_*jak 10 android android-syncadapter
我有一个应用程序SyncAdapter.除了正常的同步之外,我还会触发一个USER_READ事件,我只需将它传递Bundle给适配器而不保留它:
Bundle settingsBundle = new Bundle();
settingsBundle.putString(SyncAdapter.USER_READ, uid);
ContentResolver.requestSync(account, authority, settingsBundle);
Run Code Online (Sandbox Code Playgroud)
这将在将来的某个时候正确调用我的同步例程.每个uid组中的Bundle将触发其自己的运行,一切都被预期同步.
如果现在连接不好,或者请求超时,那么我设置了一个软错误:
syncResult.stats.numIoExceptions += 1;
Run Code Online (Sandbox Code Playgroud)
这将导致请求稍后重复.这也很好用.
这些SyncRequests/Bundles持续多长时间?
该文件指出,该遇到软错误将导致exponentional补偿和同步将在以后运行一段时间.
鉴于连接错误并且同步因软错误而多次失败:我想知道是否只是将同步请求排入队列,或者我是否必须自己提供某种持久性以确保在某些时候发送请求.
我不得不深入挖掘Android运行时源代码以找到问题的答案.让我们从问题的第一部分开始.
是否会在某些时候取消[同步]?多次软错误后?
答案可能是否定的,直到满足下列条件之一:
SyncManager不开始重新安排同步SyncAdapter与ContentResolver.SYNC_EXTRAS_DO_NOT_RETRYSyncResult.tooManyRetries为true和同步不是仅上传SyncResult.tooManyDeletions到true,没有设置SyncStats.numInserts或SyncStats.numUpdates以非空值,并且同步是不是仅上载因此,多个软错误不会取消同步,这就是原因.
处理所有同步事件从SyncManager.SyncHandler.handleMessage()方法开始并在方法中继续SyncManager.runSyncFinishedOrCanceledH().第一个参数runSyncFinishedOrCanceledH()是SyncResult,可以是null.它不是null在同步完成时或SyncAdapter服务断开时,这是一个软错误.它是null同步取消,过期(运行超过30分钟),不使用网络超过1分钟,而在另一种情况下,我不完全理解.
如果SyncResult不是null并且同步已完成,则SyncManager尝试通过调用重新安排同步maybeRescheduleSync().此方法检查一些标志和同步结果,ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY并SyncResult.tooManyRetries确定是否需要重新安排同步.在SyncManager完成软错误的同步检查后,syncResult.hasSoftError()它会重新安排同步而无需任何额外的检查.
现在是问题的第二部分.
重启设备后,它会[同步]再次入队吗?
是的,它会的.当SystemServer初始化时,它会创建ContentService,然后调用它的systemReady()方法,这反过来创建SyncManager.SyncManager在其构造函数中创建SyncStorageEngine,它在其构造函数中读取所有挂起的操作,包括额外的包.这就是同步包中允许的一组类型非常有限的原因.当用户启动时,SynqQueue通过调用添加所有待处理操作SyncQueue.addPendingOperations().
这个答案是我对Android代码的分析结果,所以我不能保证它是100%正确的.但您可以将此信息用作您自己研究的起点.
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |