如何知道同步完成的时间?

我已经实现了一个同步适配器,我想在我的活动中完成一个callback。 我已经尝试使用ContentResolver.addStatusChangeListener ,但我只获取同步处于挂起/活动状态时的callback。 以下是我的活动中的一些相关代码:

 @Override protected void onResume() { super.onResume(); final int mask = ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE | ContentResolver.SYNC_OBSERVER_TYPE_PENDING; syncObserverHandle = ContentResolver.addStatusChangeListener(mask, syncStatusObserver); } @Override protected void onPause() { super.onPause(); if (syncObserverHandle != null) { ContentResolver.removeStatusChangeListener(syncObserverHandle); syncObserverHandle = null; } } private SyncStatusObserver syncStatusObserver = new SyncStatusObserver() { @Override public void onStatusChanged(int which) { AccountManager am = AccountManager.get(TodosActivity.this); Account a = am.getAccountsByType(Const.ACCOUNT_TYPE)[0]; Log.d(Const.TAG, "Sync status changed: " + which); if (!ContentResolver.isSyncActive(a, DataProvider.AUTHORITY) && !ContentResolver.isSyncPending(a, DataProvider.AUTHORITY)) { Log.d(Const.TAG, "Sync finished, should refresh nao!!"); } } }; 

但是, onStatusChanged方法中的if永远不会有效。 我从JumpNote演示中得到了这个例子,它的工作原理可能是因为它也是在onResume()手动调用的,所以当同步完成时可能永远不会被系统调用。 或者是,我做错了什么? 以下是我在logcat中获得的内容:

 D/MYAPP (10903): Sync status changed: 2 D/MYAPP (10903): Sync status changed: 2 D/MYAPP (10903): Sync status changed: 4 D/MYAPP (10981): --> DataSyncAdapter.onPerformSync() D/MYAPP (10981): <-- DataSyncAdapter.onPerformSync() D/MYAPP (10903): Sync status changed: 4 

所以,我似乎可以依靠第二次SYNC_OBSERVER_TYPE_ACTIVE (4)状态更改刷新我的数据,但这似乎真的很难看。 有任何想法吗?

Solutions Collecting From Web of "如何知道同步完成的时间?"

我发现的一个解决scheme是彻底抛弃ContentResolver ,并实现自己的广播。 基本上,在onPerformSync的最后添加这个在同步适配器中:

 Intent i = new Intent(SYNC_FINISHED); sendBroadcast(i); 

而这在活动中:

 @Override protected void onResume() { super.onResume(); registerReceiver(syncFinishedReceiver, new IntentFilter(DataSyncService.SYNC_FINISHED)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(syncFinishedReceiver); } private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(Const.TAG, "Sync finished, should refresh nao!!"); } }; 

这似乎工作得很好,但是我希望能find一些在SDK中直接通知我什么时候同步完成。

奇怪,它对我有用。

在我的Activity我有:

  @Override protected void onPause() { super.onPause(); ContentResolver.removeStatusChangeListener(mContentProviderHandle); } @Override protected void onResume() { super.onResume(); mContentProviderHandle = ContentResolver.addStatusChangeListener( ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, this); } @Override public void onStatusChanged(int which) { AccountManager accountManager = AccountManager.get(this); Account[] accounts = accountManager .getAccountsByType(AuthenticatorActivity.PARAM_ACCOUNT_TYPE); if (accounts.length <= 0) { return; } updateRefresh(ContentResolver.isSyncActive(accounts[0], MyContentProvider.AUTHORITY)); } // Since onStatusChanged() is not called from the main thread // I need to update the ui in the ui-thread. private void updateRefresh(final boolean isSyncing) { runOnUiThread(new Runnable() { @Override public void run() { if (isSyncing) { mRefreshMenu.setActionView(R.layout.menu_item_refresh); } else { mRefreshMenu.setActionView(null); } } }); } 

我正在做类似的工作,并且在onStatusChanged函数的末尾还有一个Log.d,并且它没有执行!

所以经过15分钟的错误debugging和试用后,我意识到我需要添加READ_SYNC_STATS权限,尽pipe我已经拥有了GET_ACCOUNTS权限。 所以,请检查你是否得到了正确的许可,而不是“如果”不成立,它一直保释。