我想在ActionBar中顯示ProgressBar,同時我的SyncAdapter主動將內容同步到網絡和從網絡同步內容。SyncAdapter運行動畫 - 如何知道SyncAdapter是否正在同步
我試過用SyncStatusObserver和ContentProvider.addStatusChangeListener一起使用。但是,我無法檢查SyncAdapter是否正在運行。我只能檢查:
- SyncAdapter使用ContentResolver.isSyncPending
- 未決SyncAdapter掛起或使用ContentResolver.isSyncActive
這些標誌可以組合積極開展工作:!isSyncPending && isSyncActive
,以便它可以檢查一個SyncAdapter正在積極工作,並沒有任何待定的工作。但是,在某些情況下,SyncAdapter正在積極工作,並有第二個未決請求等待它。
看起來很簡單,但我找不到解決此問題的方法。在SyncAdapter未運行時顯示ProgressBar會給用戶留下同步非常慢的印象。不顯示ProgressBar會讓用戶認爲沒有任何事情發生。
上面的代碼解決方案如下所示。我們註冊的觀察者在activity.onResume:
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
的的SyncObserver在這裏定義爲:
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();
}
}
對於Eclair,Froyo,Gingerbread,上述解決方案僅適用於設備只有一個帳戶的情況。如果設備上存在多個帳戶,則第一個帳戶將僅同步;其餘的被忽略。 – ChuongPham