2012-10-30 12 views
11

Postępuję zgodnie z tytułem Why does ContentResolver.requestSync not trigger a sync?, ale metoda synchronizacji nie jest wyświetlana na ekranie Konto & Synchronizacja w ustawieniach. Myślę, że onPerformSync() nie jest wywoływana. Próbuję debugować, ale nie znaleziono dziennika błędów. Oto mój kod:Nie można wykonać synchronizacji (funkcja onPerformSync nie jest wywoływana)

syncAdapter.xml

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
android:accountType="@string/ACCOUNT_TYPE" 
android:contentAuthority="@string/AUTHORITY" 
android:userVisible="true" 
android:isAlwaysSyncable="true" 

/>

SyncService.java

public class CalendarSyncService extends Service{ 
private static SyncAdapterImpl sSyncAdapter = null; 
private static String list_event_ids; 
private static Requestor requestor; 

public void onCreate(){ 
    super.onCreate(); 
    if (sSyncAdapter == null) 
     sSyncAdapter = new SyncAdapterImpl(this); 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return sSyncAdapter.getSyncAdapterBinder(); 
} 

public class SyncAdapterImpl extends AbstractThreadedSyncAdapter { 

    Context context; 
    public SyncAdapterImpl(Context context) { 
     super(context, true); 
     // TODO Auto-generated constructor stub 
     this.context = context; 
    } 

    @Override 
    public void onPerformSync(Account arg0, Bundle arg1, String arg2, 
      ContentProviderClient arg3, SyncResult arg4) { 
     // TODO Auto-generated method stub 
     Log.e("thuutai", "Perform Sync Call"); 

     try { 
      CalendarSyncService.performSync(context); 
     } catch (DOMException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

ja to nazywam tu

public void onClick(View arg0) { 
Bundle params = new Bundle(); 
     params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false); 
     params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false); 
     params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false); 
     ContentResolver.addPeriodicSync(selectedAccount, getString(R.string.AUTHORITY), params, 3600); 
     ContentResolver.setSyncAutomatically(selectedAccount, getString(R.string.AUTHORITY), true); 

     ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);} 

manifest.xml

<service android:name=".service.CalendarSyncService" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.content.SyncAdapter" /> 
     </intent-filter> 
     <meta-data android:name="android.content.SyncAdapter" 
     android:resource="@xml/syncadapter" /> 
    </service> 

I badane w Nexus S Androida 4.0. Dziękujemy za lekturę!

+0

może to jest ten sam problem: http://stackoverflow.com/questions/15810659/android-syncadapter-retry/16294867 – Kenumir

+0

W tej linii potrzebie podać naszą nazwę pakietu lub jest to wspólna deklaracja dla wszystkich projektów? – Madhu

+0

problem polega na tym, że nie aktualizujesz po ustawieniu sync_extras_manual na false, to powinno być prawdą – schwiz

Odpowiedz

1

Coś, co można spróbować to:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 

Próbowałem ustawienie flagi isAlwaysSyncable ale to nie działa dla mnie (mimo że mogła być inna kwestia).

7

Czasami ta metoda nie zostanie wywołana z powodu podobnej synchronizacji w toku. Możesz to sprawdzić i anulować, używając następującego kodu:

if (ContentResolver.isSyncPending(yourAccount, yourAuthority) || 
    ContentResolver.isSyncActive(yourAccount, yourAuthority)) { 
    Log.i("ContentResolver", "SyncPending, canceling"); 
    ContentResolver.cancelSync(yourAccount, yourAuthority); 
} 
+0

, że problem rozwiązałem tak długo. W każdym razie, dziękuję za zainteresowanie .. –

+0

Wszyscy potrzebują tego! –

-1

Musisz wymusić ręczną synchronizację.

Bundle params = new Bundle(); 
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 
ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params); 
Powiązane problemy