2012-10-30 10 views
11

मैं इस शीर्षक का अनुसरण करता हूं Why does ContentResolver.requestSync not trigger a sync? लेकिन सिंक विधि खाता & सेटिंग स्क्रीन में सिंक नहीं होता है। मुझे लगता है कि onPerformSync() नहीं कहा जाता है। मैं डीबग करने की कोशिश करता हूं लेकिन कोई त्रुटि लॉग नहीं मिला। यहाँ मेरी कोड हैं:सिंक निष्पादित नहीं कर सकता है (ऑनफॉरफ़ॉर्म सिंक को नहीं कहा जाता है)

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

} 

मैं इसे यहाँ में

फोन
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> 

मैं नेक्सस एस एंड्रॉयड 4.0 में परीक्षण किया गया। आपके पढ़ने के लिए धन्यवाद!

+0

शायद कि एक ही समस्या है: http://stackoverflow.com/questions/15810659/android-syncadapter-retry/16294867 – Kenumir

+0

<कार्रवाई एंड्रॉयड: नाम = "android.content.SyncAdapter" /> इस पंक्ति जरूरत हमारे पैकेज का नाम देने के लिए या यह सभी परियोजनाओं के लिए आम घोषणा है ?? – Madhu

+0

समस्या यह है कि आप कह रहे हैं कि जब आप sync_extras_manual को गलत पर सेट करते हैं तो अद्यतन नहीं करते हैं, यह सत्य होना चाहिए – schwiz

उत्तर

1

कुछ है कि आप की कोशिश कर सकते है:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 

मैं isAlwaysSyncable ध्वज स्थापित करने की कोशिश की लेकिन यह मेरे लिए काम नहीं किया है (हालांकि कि एक अलग समस्या हो सकती है)।

7

कभी-कभी इस विधि को समान सिंक की प्रगति के कारण नहीं कहा जाएगा। आप इसे जांच सकते हैं और निम्न कोड के साथ रद्द कर सकते हैं:

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

उस समस्या को मैंने बहुत लंबा समय हल किया। वैसे भी, आपके विषय के लिए धन्यवाद .. –

+0

हर किसी को इसका उपयोग करने की ज़रूरत है! –

-1

आपको मैन्युअल सिंक्रनाइज़ेशन को मजबूर करना होगा।

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); 
संबंधित मुद्दे