SyncAdapter не вызывается в зависимости от порядка вызовов настройки учетной записи - PullRequest
16 голосов
/ 28 октября 2011

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

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

Ответы [ 2 ]

7 голосов
/ 13 декабря 2012

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

Подробную информацию о решении, с которым я работал, используя SyncAdapter, смотрите в моем ответе здесь:

https://stackoverflow.com/a/12015967/988870

4 голосов
/ 25 июля 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...