Tôi đã triển khai bộ điều hợp đồng bộ hóa và tôi muốn nhận lại cuộc gọi khi hoàn thành hoạt động của mình. Tôi đã thử sử dụng ContentResolver.addStatusChangeListener
, nhưng tôi chỉ nhận được cuộc gọi lại khi đồng bộ hóa đang chờ/đang hoạt động. Dưới đây là một số mã có liên quan từ hoạt động của tôi:Làm thế nào để biết khi nào đồng bộ kết thúc?
@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!!");
}
}
};
Tuy nhiên, if
trong phương pháp onStatusChanged
là không bao giờ hợp lệ. Tôi đã lấy ví dụ này từ JumpNote demo nơi nó hoạt động có thể vì nó cũng được gọi theo cách thủ công trong onResume()
, vì vậy nó có thể không bao giờ được gọi là bởi hệ thống khi đồng bộ hóa kết thúc. Hoặc là nó, và tôi đang làm điều gì đó sai? Đây là những gì tôi nhận được trong 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
Vì vậy, có vẻ như tôi thể dựa vào SYNC_OBSERVER_TYPE_ACTIVE
(4) thay đổi trạng thái thứ hai để làm mới dữ liệu của tôi, nhưng điều đó dường thực sự xấu xí. Bất kỳ ý tưởng?
+1 Tôi đã mất một giờ với 'ContentResolver.isSyncActive'. Tự làm nó thực sự dễ dàng hơn nhiều. – rds
Khi bạn nói: '" thêm điều này trong dịch vụ đồng bộ hóa "' bạn có thực sự có nghĩa là bộ điều hợp đồng bộ hóa không? '" ... ở cuối "' làm cho tôi nghĩ rằng: khi đồng bộ hoàn thành vào cuối 'onPerformSync'. – HGPB
Tôi không hiểu điều này, những gì sendBroadcast và SYNC_FINISHED? –