SyncAdapter に問題があり、修正方法がわかりません。
定期的な同期を使用しています。onPerformSync メソッドは、プロセスが機能していることを知るための情報をログに記録するだけです (コンテンツ プロバイダーなどでの notifyChanges の呼び出しはありません)。
プロジェクトは 2 つのアプリで構成されています。最初のアプリはユーザー アカウントを作成します (テスト目的のみ)。2 つ目は、同期アダプターを保持します。これは、プロジェクトの範囲では完全に合法であることに注意してください。
最初にアカウントでアプリをインストールします。アカウントが作成されていることがわかります。
次に、同期アダプターを使用してアプリをインストールすると、最初に同期がハングします。アカウントの同期設定を見ると、スピナー アイコンが継続的に実行されており、ログ メッセージが登録されていません (つまり、onPerformSync に到達していません)。
ただし、設定で同期をキャンセルすると、同期プロセスが正常に機能し始めます。これは、アカウント、コンテンツ プロバイダー、および SyncService 間の配線が適切に設定されていることを意味します。
アカウントを追加/削除すると他の同期プロセスがトリガーされることを認識しているため、同期アダプターを使用してアプリをインストールする前に十分な時間をとります.
なぜこれが起こっているのかについてのヒントはありますか?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAccountManager = AccountManager.get(this);
// No worries here. The account exists and it's the one I want
Account[] accounts = mAccountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
// Just first account for TESTING purposes
if (accounts != null && accounts.length > 0)
account = accounts[0];
else {
Log.e(TAG, "No accounts set!!");
return;
}
// Set sync for this account.
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.setIsSyncable(account, authority, 1); // Mandatory since 3.1
// Allows the provider to sync when internet connection is back
ContentResolver.setSyncAutomatically(account, authority, true);
// Add a periodic synchronization
ContentResolver.addPeriodicSync(account, authority, extras, POLL_FREQUENCY);
}
編集
同期でキャンセルを呼び出すと、機能することがわかりました。最善の解決策ではありませんが、今では問題を解決しています。この行を「isFirstUse」フラグと組み合わせて配置します。
ContentResolver.cancelSync(account, authority);