2011-10-28 10 views
16

私は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をいくつかの不整合な状態に置いています。なぜなら、アカウント作成時に即座に同期要求を発し、その設定を変更しているからです。しかし、(ほとんど一貫した)ドキュメンテーションには、いつでも好きなときにこれらの関数を呼び出す際の問題は言及されていません。

他の人がSyncAdaptersで苦労していることを覚えておいて、ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);に電話しない限り、contentResolver.requestSync()はあなたのSyncAdapter.onPerformSync()をトリガーしません。

誰かがこの現象を説明できますか? AccountsとSyncingを取り巻くドキュメントは、最も少なく言えばいくぶん不明です。

この現象は2.1のエミュレータで発生し、2.1 SDKに対してコンパイルされています。

+0

+1!これを見てsetIsSyncableと呼ぶまでには、何時間もの不満がありました!ありがとうございました! –

+0

非常に有益です。自分の質問への回答を書いてください。私たちはそれが "unasnwered"リストにないことを知っています。 – rds

+0

私は質問の部分が明確になるように私の質問を更新しました。私は、誰かがこの現象が起こる理由を説明したり、詳しく説明したりしたいと思っています。 –

答えて

6

ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);を呼び出さない限り、contentResolver.requestSync()はSyncAdapter.onPerformSync()をトリガーしません。私はSyncAdapterを使用して行ったソリューションの詳細な説明については

、ここに私の答えを参照してください。定期的な同期が「wasnなぜ

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

+0

私は同じ問題に直面しています、答えをありがとう。 –

4

を私は把握しようと時間の壁に頭を打ちました働いている。ポーリング頻度はミリ秒単位ではなく秒単位(リテラル)で、ミリ秒単位で秒単位である必要があります。だから、あなたはそれが毎分半を同期したい場合たとえば、あなたが呼び出す必要があります:それはドキュメントにあるよう

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

また、渡されたバンドルはnullにすることはできません、それがスローされますNullPointerException。

関連する問題