Я реализовал адаптер синхронизации и хочу получить обратный вызов, когда он завершится в моей деятельности. Я попытался использовать 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!!");
}
}
};
Однако if
в методе onStatusChanged
недопустим. Я взял этот пример из демонстрации 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) изменение статуса, чтобы обновить свои данные, но это кажется действительно уродливым. Есть идеи?