Tôi đã gặp một số hành vi hơi kỳ quặc với SyncAdapter của tôi.SyncAdapter không được gọi tùy thuộc vào thứ tự của các cuộc gọi Thiết lập tài khoản
Lần đầu tiên tôi cài đặt ứng dụng của mình (sau khi gỡ cài đặt bằng adb), nó sẽ khởi chạy và tạo một tài khoản. Tùy thuộc vào thứ tự của một số câu lệnh (xem bên dưới), onPerformSync() của SyncAdapter sẽ không bao giờ được gọi; tài khoản của tôi trong "Tài khoản và đồng bộ hóa" hiển thị biểu tượng "đang đồng bộ hóa" đang quay vòng vô thời hạn. Nếu sau đó tôi bỏ chọn hộp kiểm đồng bộ bên cạnh tài khoản của ứng dụng và sau đó kiểm tra lại, onPerformSync() của tôi được gọi ngay lập tức.
Điều này làm cho SyncAdapter của tôi không bao giờ được gọi. "Đồng bộ hóa cơ bản dở dang" biểu tượng quay mãi mãi, trừ khi tôi bỏ chọn, sau đó kiểm tra lại hộp kiểm sync:
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);
Với đặt hàng này của các báo cáo tương tự, mọi thứ hoạt động hoàn hảo:
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);
tôi đoán là tôi đang đặt SyncManager vào một số trạng thái không nhất quán do nó bắn ra một yêu cầu đồng bộ ngay lập tức trong việc tạo tài khoản, và tôi đang thay đổi cấu hình của nó dưới chân nó. Nhưng tài liệu (hầu như không mạch lạc) không đề cập đến bất kỳ vấn đề nào với việc gọi các hàm này bất cứ khi nào bạn muốn.
Để dành cho những người khác đấu tranh với SyncAdapters, tôi thấy rằng contentResolver.requestSync()
sẽ không bao giờ kích hoạt SyncAdapter.onPerformSync()
của bạn trừ khi bạn gọi ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
Ai đó có thể giải thích hành vi này? Tài liệu xung quanh Tài khoản và Đồng bộ hóa có phần không rõ ràng để nói ít nhất.
Tôi nhận được hành vi này trên Trình mô phỏng 2.1, biên dịch dựa trên 2.1 SDK.
+1! Chúng tôi đã mất rất nhiều thời gian cho đến khi chúng tôi xem xét điều này và được gọi là setIsSyncable! Cảm ơn bạn! –
Rất nhiều thông tin. Xin vui lòng viết một câu trả lời cho câu hỏi của riêng bạn, để chúng tôi biết nó không có trong danh sách "không được trả lời" nữa. – rds
Tôi đã cập nhật câu hỏi của mình để phần câu hỏi rõ ràng hơn. Tôi muốn ai đó giải thích hoặc giải thích lý do tại sao hành vi này xảy ra. –