2011-10-28 38 views
16

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.

+0

+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! –

+0

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

+0

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. –

Trả lời

6

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);.

Đối với một tài khoản chi tiết của giải pháp tôi đã đi với việc sử dụng SyncAdapter, xem câu trả lời của tôi ở đây:

https://stackoverflow.com/a/12015967/988870

+0

Tôi đang gặp phải sự cố tương tự, Cảm ơn bạn đã trả lời. –

4

tôi chỉ đập đầu tôi chống lại một bức tường trong nhiều giờ cố gắng tìm ra lý do tại sao đồng bộ hóa định kỳ wasn' t làm việc. Nó chỉ ra rằng tần số thăm dò cần phải được tính bằng giây (theo chữ) không phải là mili giây, và không tính bằng giây tính bằng mili giây. Vì vậy, ví dụ: nếu bạn muốn đồng bộ hóa sau mỗi phút rưỡi, bạn sẽ cần phải gọi:

  ContentResolver.addPeriodicSync(
        account, 
        authority, 
        Bundle.EMPTY, 
        90 
      ); 

Ngoài ra, gói được chuyển vào không thể rỗng như trong tài liệu, nó sẽ ném một NullPointerException.

Các vấn đề liên quan