2012-10-30 13 views
11

Tôi làm theo tiêu đề này Why does ContentResolver.requestSync not trigger a sync? nhưng phương thức Đồng bộ hóa không xuất hiện trong màn hình Tài khoản & Đồng bộ hóa trong Cài đặt. Tôi nghĩ rằng onPerformSync() không được gọi. Tôi cố gắng gỡ lỗi nhưng không tìm thấy nhật ký lỗi nào. Dưới đây là mã của tôi:Không thể thực hiện Đồng bộ hóa (onPerformSync không được gọi)

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

} 

Tôi gọi nó là ở đây

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> 

Tôi đã thử nghiệm trong Nexus S chạy Android 4.0. Cảm ơn bạn đã đọc!

+0

có lẽ đó là cùng một vấn đề: http://stackoverflow.com/questions/15810659/android-syncadapter-retry/16294867 – Kenumir

+0

Trong dòng nhu cầu này để cung cấp tên gói của chúng tôi hoặc đây là tuyên bố chung cho tất cả các dự án? – Madhu

+0

vấn đề là bạn đang nói không cập nhật khi bạn đặt sync_extras_manual để sai nó phải là sự thật – schwiz

Trả lời

1

Cái gì mà bạn có thể thử là:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 

tôi đã cố gắng thiết lập các isAlwaysSyncable cờ nhưng nó đã không làm việc cho tôi (mặc dù đó có thể là một vấn đề khác nhau).

7

Đôi khi phương pháp này sẽ không được gọi do quá trình đồng bộ hóa tương tự đang diễn ra. Bạn có thể kiểm tra và hủy bằng mã sau:

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

rằng vấn đề tôi giải quyết nó rất lâu. Dù sao, cảm ơn bạn đã liên quan của bạn .. –

+0

Mọi người đều cần sử dụng điều này! –

-1

Bạn phải buộc đồng bộ hóa thủ công.

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); 
Các vấn đề liên quan