我已經實現了一個同步適配器,並且我想在我的活動中完成回調。我嘗試過使用ContentResolver.addStatusChangeListener
,但我只在同步處於待處理/活動狀態時纔會收到回調。下面是我的一些活動相關的代碼:如何知道同步完成的時間?
@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 demo中得到了這個例子,它的工作原理可能是因爲它也在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)狀態改變刷新我的數據,但似乎真的醜。有任何想法嗎?
+1我用'ContentResolver.isSyncActive'失去了一個小時。自己做這件事實際上要容易得多。 – rds
當你說:'「在同步服務中添加」'你實際上是否指同步適配器? '「......在最後」'讓我想到:一旦同步在'onPerformSync'結束時完成。 – HGPB
我不明白,sendBroadcast和SYNC_FINISHED是什麼? –