2011-10-28 13 views
16

SyncAdapter'imle biraz garip davranışlar görüyorum.SyncAdapter Hesap kurulum çağrılarının sırasına bağlı olarak çağrılmıyor

Uygulamamı ilk kez yüklediğimde (adb ile kaldırdıktan sonra), bir hesap başlatır ve oluşturur. Bazı ifadelerin sırasına bağlı olarak (aşağıya bakın), SyncAdapter'ın onPerformSync() yöntemim hiçbir zaman çağrılmayacaktır; "Hesaplar ve senkronizasyon" altındaki hesabım süresiz olarak dönen "senkronizasyon devam ediyor" simgesini gösterir. Uygulamamın hesabının yanındaki senkronizasyon onay kutusunun işaretini kaldırırsam ve ardından tekrar kontrol edersem, onPerformSync() yöntemim hemen çağrılır.

Bu, SyncAdapter'imin asla çağrılmasına neden olur. "Senkronizasyon işlemi devam" simgesi işaretini kaldırmadıkça, daha sonra senkronizasyon onay kutusunu tekrar kontrol, sürekli dönen: Aynı tabloların bu sipariş ile

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); 

, her şey mükemmel çalışıyor:

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); 

Benim tahminim SyncManager'ı hesap oluşturma anında anında bir eşzamanlama isteğini kapatması nedeniyle bazı tutarsız duruma getiriyorum ve yapılandırmasını kendi ayakları altında değiştiriyorum. Ancak (ancak tutarlı bir şekilde) belgelere, istediğiniz zaman bu işlevleri çağırmakla ilgili herhangi bir sorun söz konusu değildir.

SyncAdapters ile mücadele eden başkaları için bir kenara göre, contentResolver.requestSync()'un SyncAdapter.onPerformSync() numaralı telefonu asla ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); numaralı telefonu aramadıkça tetiklemeyeceğini buldum.

Birisi bu davranışı açıklayabilir mi? Hesapları ve Senkronizasyonu çevreleyen belgeler, en azından söylemek için belli değil.

Bu davranışı, 2.1 SDK'ya karşı derleme 2.1 Emulator'unda alıyorum.

+0

+1! Buna bakana ve setIsSyncable olarak adlandırılana kadar saatler süren hayal kırıklığıydı! Teşekkür ederim! –

+0

Çok bilgilendirici. Lütfen kendi sorunuza bir cevap yazınız, böylece artık "istenmeyen" listede olmadığını biliyoruz. – rds

+0

Sorumu soru bölümün daha net olması için güncelledim. Birisinin bu davranışın neden ortaya çıktığını açıklamasını veya detaylandırmasını istiyorum. –

cevap

6

contentResolver.requestSync(), ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); numaralı telefonu aramadıkça, SyncAdapter.onPerformSync() yönteminizi hiçbir zaman tetiklemeyeceğini buldum.

Ben SyncAdapter kullanarak gitti çözümün detaylı bilgi için

, burada benim cevap bakınız:

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

+0

Aynı sorunla karşı karşıyayım, cevabı için teşekkürler. –

4

Sadece periyodik senkronizasyon değildim neden anlamaya çalışıyorum saat boyunca kafamı duvara çarptım Çalışıyor. Anketin, milisaniye cinsinden saniye cinsinden değil, milisaniye cinsinden saniye cinsinden olması gerekir. Eğer her dakika bir buçuk senkronize etmek istiyorsa Yani, örneğin,, aramak gerekir: Ayrıca

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

, geçirilen paket boş olamaz o belgelerde olduğu gibi, bir atacağım NullPointerException.