Tôi đang cố gắng tìm ra cách syncAdapter hoạt động, tôi đã sử dụng adapter SampleSync làm ví dụ/điểm bắt đầu và tôi dựa trên thử nghiệm đầu tiên của mình trên đó. Sự khác biệt duy nhất là tôi không làm việc với nhà cung cấp danh sách liên hệ mặc định, nhưng tôi cần một người của riêng mình.SyncAdapter periodicsync() không kích hoạt
Phương pháp này giống như trong bản trình diễn mẫuSyncAdapter (trong AccountAuthenticatorActivity), tôi vừa thêm đồng bộ hóa định kỳ.
public void finishLogin(String authToken) {
Log.i(TAG, "finishLogin()");
final Account account = new Account(mUsername, "be.company.syncAdapterTest");
if(mRequestNewAccount) {
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setIsSyncable(account, MY_AUTHORITY, 1);
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(account, MY_AUTHORITY, params, 30);
ContentResolver.setSyncAutomatically(account, MY_AUTHORITY, true);
ContentResolver.requestSync(account,MY_AUTHORITY,params);
} else {
mAccountManager.setPassword(account, mPassword);
}
final Intent intent = new Intent();
intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, "ACCOUNT_TEST");
intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, "be.company.syncAdapterTest");
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
Trong phương pháp perfomSync() i có phương pháp sau đây:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
Log.d(TAG, "onPerformSync() start");
// Testje
try {
final String authToken = mAccountManager.blockingGetAuthToken(account, "be.company.syncAdapterTest", NOTIFY_AUTH_FAILURE);
Log.d(TAG, SAPNetworkUtilities.getWeek(account, authToken, getRandomDate()));
} catch (OperationCanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AuthenticatorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "onPerformSync() end");
}
Ở đây tôi chỉ cần gọi một webservice SAP đơn giản và hiển thị nó trong nhật ký. Bây giờ tôi có hai câu hỏi sau đây:
- SYNC không được khởi động tự động khi tôi thêm Tài khoản trong cài đặt. Tôi cần phải đi vào bên trong tài khoản và chọn hộp kiểm để bắt đầu đồng bộ hóa?
- Đồng bộ hóa không được kích hoạt cứ 30 giây một lần trong ví dụ này ... Tôi có cần thêm điều gì đó trong phương thức perfomSync() để hệ thống biết rằng quá trình đồng bộ được thực hiện và lần chạy tiếp theo có thể bắt đầu không?
Tại thời điểm này tôi không viết giá trị trong contentProvider, chỉ vì tôi đang cố gắng tìm hiểu cách đồng bộ hóa hoạt động chi tiết.
Hiện tại tôi đang thử nghiệm trên trình giả lập Android.
Cảm ơn trước vì đã phản hồi của bạn.
Trân trọng!
Robin
trùng lặp càng tốt này của [Tại sao ContentResolver.requestSync không kích hoạt đồng bộ?] (http://stackoverflow.com/questions/5253858/why-does-contentresolver-requestsync-not-trigger-a-sync) – jcwenger
Tôi thiết lập một periodicSync với tần số <60s, và thấy một thông điệp logcat rằng hệ thống đã làm tròn nó lên đến 60 - tối thiểu không được đề cập trong tài liệu. Tất nhiên, tôi sẽ không đọc trang này nếu sau đó nó thực sự đồng bộ hóa - periodicSync cũng không làm việc cho tôi, bất kể setIsSyncable hay http://stackoverflow.com/questions/7925802/syncadapter- các cuộc gọi không được gọi-tùy-theo-của-tài-khoản-gọi-số- –
@rpan Bạn có tìm thấy câu trả lời cho điều này không? –