2011-10-28 1 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 and 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를 사용하여 갔다 솔루션에 대한 자세한 계정에 대한

, 여기 내 대답을 참조하십시오

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

+0

나는 똑같은 문제에 직면하고있다. 답을 고맙다. –

4

난 그냥주기적인 동기는 '년후 이유를 알아 내려고 시간 동안 벽에 머리를 부딪 혔어요 일하고있어. 폴링 빈도는 밀리 초가 아닌 초 (리터럴)이어야하며 밀리 초가 아닌 초입니다. 당신이 모든 분 30 초를 동기화 할 경우에 따라서, 예를 들어, 당신이 전화를해야합니다 : 또한

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

이 전달 된 번들이 null 일 수 없습니다이 문서에서와 같이, 그것은 발생합니다 NullPointerException.

관련 문제