我已经实现了一个同步适配器,并希望在我的活动中在其完成时得到回调。我尝试使用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演示中获取此示例的,它可以正常工作,可能是因为它也在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)状态更改来刷新我的数据,但那看起来非常丑陋。有任何想法吗?
ContentResolver.isSyncActive
浪费了一小时时间。自己实现其实更容易。 - rds