Tôi muốn hiển thị ProgressBar trong ActionBar trong khi SyncAdapter của tôi đang tích cực đồng bộ hóa nội dung đến và từ web.SyncAdapter chạy hoạt ảnh - cách biết liệu SyncAdapter đang tích cực đồng bộ hóa
Tôi đã thử sử dụng SyncStatusObserver cùng với ContentProvider.addStatusChangeListener. Tuy nhiên, tôi không thể kiểm tra xem SyncAdapter có đang chạy hay không. Tôi chỉ có thể kiểm tra:
- SyncAdapter đang chờ sử dụng ContentResolver.isSyncPending
- SyncAdapter đang chờ HOẶC tích cực làm việc sử dụng ContentResolver.isSyncActive
Những lá cờ có thể được kết hợp: !isSyncPending && isSyncActive
để nó có thể kiểm tra xem một SyncAdapter đang hoạt động tích cực và không có bất kỳ công việc đang chờ xử lý nào. Tuy nhiên, trong một số trường hợp, SyncAdapter đang hoạt động tích cực và có yêu cầu chờ xử lý thứ hai đang chờ nó.
Dường như đơn giản nhưng tôi không thể tìm ra cách giải quyết vấn đề này. Có ProgressBar hiển thị khi SyncAdapter không chạy đang cho người dùng ấn tượng rằng việc đồng bộ hóa rất chậm. Có nó không hiển thị ProgressBar làm cho người dùng nghĩ rằng không có gì đang xảy ra.
Giải pháp trên trong mã được hiển thị bên dưới. Chúng tôi đăng ký quan sát viên trong activity.onResume:
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
Các syncObserver được ở đây được định nghĩa là:
syncObserver = new SyncStatusObserver()
{
@Override
public void onStatusChanged(int which)
{
Account account = getSomeAccount();
boolean syncActive = ContentResolver.isSyncActive(account, CONTENT_AUTHORITY);
boolean syncPending = ContentResolver.isSyncPending(account, CONTENT_AUTHORITY);
boolean isSynchronizing = syncActive && !syncPending;
updateRefreshButtonState();
}
}
Đối với Eclair, Froyo, Gingerbread, giải pháp ở trên chỉ hoạt động nếu thiết bị chỉ có một tài khoản. Nếu có nhiều tài khoản tồn tại trên thiết bị, tài khoản đầu tiên sẽ chỉ được đồng bộ hóa; phần còn lại bị bỏ qua. – ChuongPham