SyncAdapter не вызывается в зависимости от порядка вызовов настройки учетной записи

Я столкнулся с немного странным поведением моего SyncAdapter.

При первой установке приложения (после удаления с помощью adb) оно запускается и создает учетную запись. В зависимости от порядка некоторых операторов (см. Ниже) мой SyncAdapter onPerformSync () никогда не будет вызван; Моя учетная запись в разделе «Учетные записи и синхронизация» показывает значок «выполняется синхронизация», вращающийся бесконечно. Если я затем сниму флажок синхронизации рядом с учетной записью моего приложения, а затем снова поставлю его, мой onPerformSync () будет вызван немедленно.

Это приводит к тому, что мой SyncAdapter никогда не вызывается.Значок «выполняется синхронизация» вращается бесконечно, если я не сниму флажок, а затем снова установите флажок синхронизации:

final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);

При таком порядке выполнения тех же операторов все работает отлично:

final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);

Я предполагаю, что я помещаю SyncManager в какое-то несогласованное состояние из-за того, что он мгновенно запускает запрос на синхронизацию при создании учетной записи, и я меняю его конфигурацию под его ногами. Но в (едва понятной) документации не упоминаются проблемы с вызовом этих функций в любое время.

Помимо прочего, я обнаружил, что contentResolver.requestSync () никогда не вызовет ваш SyncAdapter.onPerformSync () , если вы не вызовете ContentResolver.setIsSyncable. (аккаунт, getString (R.string.CONTENT_AUTHORITY), 1); .

Может кто-нибудь объяснить такое поведение? Документация, связанная с учетными записями и синхронизацией, по меньшей мере неясна.

Я получаю такое поведение на эмуляторе 2.1 при компиляции с SDK 2.1.

16
задан Jarrod Smith 24 December 2011 в 02:06
поделиться