Подтвердить что ты не робот

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

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

В первый раз, когда я устанавливаю свое приложение (после удаления с помощью adb), он запускает и создает учетную запись. В зависимости от упорядочения некоторых операторов (см. Ниже) мой SyncAdapter onPerformSync() никогда не будет вызываться; моя учетная запись в разделе "Учетные записи и синхронизация" показывает, что значок "sync in progress" работает бесконечно. Если я сниму галочку синхронизации рядом с моей учетной записью приложения и затем перепроверяю ее, мой 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 в какое-то несогласованное состояние из-за того, что он мгновенно отключает запрос синхронизации при создании учетной записи, и я меняю конфигурацию под ногами. Но (едва согласованная) документация не упоминает никаких проблем с вызовом этих функций, когда захотите.

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

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

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

4b9b3361

Ответ 1

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

Подробный отчет о решении, который я использовал с помощью SyncAdapter, см. в моем ответе здесь:

fooobar.com/questions/271553/...

Ответ 2

Я просто часами стучал головой о стену, пытаясь понять, почему периодическая синхронизация не работает. Оказывается, частота опроса должна быть в секундах (буквально), а не в миллисекундах, а не в секундах в миллисекундах. Например, если вы хотите синхронизировать каждую минуту с половиной, вам нужно позвонить:

            ContentResolver.addPeriodicSync(
                    account,
                    authority,
                    Bundle.EMPTY,
                    90
            );

Кроме того, переданный пакет не может быть нулевым, как в документации, он выдает исключение NullPointerException.