16

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 が一貫性のない状態になり、その足元で構成を変更していると思われます。しかし、(かろうじて一貫性のある) ドキュメントでは、いつでもこれらの関数を呼び出す際の問題については言及されていません。

SyncAdapters に苦労している他の人への余談ですが、 を呼び出さない限り、それcontentResolver.requestSync()がトリガーされないことがわかりました。SyncAdapter.onPerformSync()ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);

誰かがこの動作を説明できますか? アカウントと同期に関するドキュメントは、控えめに言っても不明確です。

2.1 SDK に対してコンパイルすると、2.1 エミュレーターでこの動作が発生します。

4

2 に答える 2

7

contentResolver.requestSync()を呼び出さない限り、 SyncAdapter.onPerformSync() がトリガーされないことがわかりましたContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);

SyncAdapter を使用して行ったソリューションの詳細については、こちらの回答を参照してください。

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

于 2012-12-13T01:42:29.863 に答える
4

定期的な同期が機能しない理由を突き止めようとして、何時間も頭を壁にぶつけました。ポーリング頻度は、ミリ秒単位ではなく秒単位 (リテラル) である必要があり、ミリ秒単位ではありません。したがって、たとえば、1 分半ごとに同期する場合は、次のように呼び出す必要があります。

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

また、ドキュメントにあるように、渡されたバンドルを null にすることはできず、NullPointerException がスローされます。

于 2014-07-25T16:09:41.093 に答える