如何知道同步完成的时间?

Fel*_*lix 31 android sync callback

我已经实现了一个同步适配器,我想在我的活动中完成回调.我尝试过使用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!!");
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,方法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
Run Code Online (Sandbox Code Playgroud)

所以,似乎我可以依靠第二个SYNC_OBSERVER_TYPE_ACTIVE(4)状态更改来刷新我的数据,但这看起来真的很难看.有任何想法吗?

Fel*_*lix 41

我发现的一个解决方案是ContentResolver完全放弃,并实现我自己的广播.基本上,在同步适配器中添加它,在以下结尾onPerformSync:

Intent i = new Intent(SYNC_FINISHED);
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

这在活动中:

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(syncFinishedReceiver, new IntentFilter(DataSyncService.SYNC_FINISHED));
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(syncFinishedReceiver);
}

private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(Const.TAG, "Sync finished, should refresh nao!!");
    }
};
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,但我希望在SDK中找到一些在同步完成时直接通知我的东西.

  • 我不明白这是什么,sendBroadcast和SYNC_FINISHED是什么? (2认同)
  • 请查看此答案以获得更好的说明:http://stackoverflow.com/questions/9433674/get-notified-when-requestsync-function-completed (2认同)

Mac*_*rse 17

奇怪,它对我有用.

在我的Activity身上:

  @Override
  protected void onPause() {
    super.onPause();
    ContentResolver.removeStatusChangeListener(mContentProviderHandle);
  }

  @Override
  protected void onResume() {
    super.onResume();
    mContentProviderHandle = ContentResolver.addStatusChangeListener(
        ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, this);
  }

  @Override
  public void onStatusChanged(int which) {
    AccountManager accountManager = AccountManager.get(this);
    Account[] accounts = accountManager
        .getAccountsByType(AuthenticatorActivity.PARAM_ACCOUNT_TYPE);

    if (accounts.length <= 0) {
      return;
    }

    updateRefresh(ContentResolver.isSyncActive(accounts[0],
        MyContentProvider.AUTHORITY));
  }

  // Since onStatusChanged() is not called from the main thread
  // I need to update the ui in the ui-thread.
  private void updateRefresh(final boolean isSyncing) {
    runOnUiThread(new Runnable() {

      @Override
      public void run() {
        if (isSyncing) {
          mRefreshMenu.setActionView(R.layout.menu_item_refresh);
        } else {
          mRefreshMenu.setActionView(null);
        }
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但我必须添加2个权限:GET_ACCOUNTS,READ_SYNC_STATS (2认同)

Phu*_*eat 6

我正在研究类似的东西,并且在onStatusChanged函数的末尾还有一个Log.d,它没有执行!

因此,经过15分钟的调试和错误试验后,我意识到我需要添加READ_SYNC_STATS权限,但我已经获得了GET_ACCOUNTS权限.因此,请检查您是否获得了正确的许可,而不是"if"没有成为现实,而是它一直保留.