2017-05-22 14 views
10

Tôi vừa tạo Tài khoản cho ứng dụng của mình.SyncAdapter: Tài khoản được tạo, requestSync OK, nhưng setSyncAutomatically không hoạt động

  • Các tài khoản là có thể nhìn thấy trong cài đặt
  • tôi đặt syncable = "true" trong XML của tôi
  • tôi có thể thực hiện một đồng bộ thủ công bằng cách nhấn vào cài đặt -> onPerformSync được gọi
  • tôi có thể thực hiện đồng bộ hóa "mã" bằng cách gọi ContentResolver.requestSync -> onPerformSync được gọi là
  • Và tất nhiên, có, đồng bộ hóa được bật trong cài đặt. Tôi không sử dụng bất kỳ tiết kiệm điện.

Tôi cũng theo tất cả các bước từ đây: https://stackoverflow.com/a/5255360/327402

Đây là mã của tôi để có được sự đồng bộ hóa theo mã

AccountManager am = AccountManager.get(this); 
Account[] accounts = am.getAccountsByType(ACCOUNT); 
//Log.e("DEBUG", "Accounts: " + accounts.length); 
if (accounts.length == 0) { 
    Account account = new Account(getString(R.string.app_name), ACCOUNT); 
    ContentResolver.setIsSyncable(account, AUTHORITY, 1); 
    ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), 7200); 
    ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 
    if (am.addAccountExplicitly(account, "pass1", null)) 
     Log.i("DEBUG", "account Created: " + account.name + ", " + account.type); 
    else 
     Log.i("DEBUG", "addAccountExplicitly returned false"); 
    } 
else{ 
    ContentResolver.requestSync(accounts[0], AUTHORITY, new Bundle());// THIS IS WORKING!!! 
    } 
} 

Vì vậy, tất cả mọi thứ có vẻ đúng và tốt.

Nhưng rất tiếc, tôi không thể đồng bộ hóa định kỳ! Khi tôi mở cài đặt, tài khoản, tôi thấy tài khoản và ngày và thời gian là lúc tôi thực hiện đồng bộ hóa theo mã hoặc theo cách thủ công.

Bất kỳ ý tưởng nào về những gì tôi đã làm sai hoặc những gì tôi đã quên?

+0

Bạn biết rằng pollFrequency tối thiểu kỳ đồng bộ là 1h – Selvin

+0

Vâng, đó là lý do tại sao tôi đã sử dụng 2 giờ trong mã của tôi, như bạn có thể thấy ... :-D –

+0

Quá trình thiết lập đồng bộ hóa này có thể gây phiền toái. Thử thiết lập tài khoản của bạn trước khi thiết lập đồng bộ hóa định kỳ của bạn. Hiện tại, bạn đã thiết lập đồng bộ hóa định kỳ, sau đó là tài khoản của bạn nếu tôi đọc mã của bạn chính xác. – Cheticamp

Trả lời

2

Rewrite

Tôi đã đặt cùng một dự án mẫu trên GitHub thể hiện một SyncAdapter làm việc. Dự án là here.

Tôi chỉ thử tính năng này trên trình giả lập với API 17 vì tôi không muốn đợi khoảng một giờ hoặc lâu hơn (có thể lâu hơn) để đồng bộ hóa diễn ra. Tôi cũng khuyên bạn nên đi theo con đường này.

Trên API 17, bản trình diễn này sẽ thực hiện đồng bộ sau mỗi 30 giây. Tất cả mọi thứ chạy ra khỏi các hoạt động chính với các lớp hỗ trợ sơ khai: SyncAdapter, StubProvider, vv Điều duy nhất bộ điều hợp đồng bộ hóa là để đăng nhập một tin nhắn để logcat rằng nó đã chạy.

Tôi thực sự không thấy bất kỳ điều gì sai với mã của bạn ngoài, có thể, thứ tự của các cuộc gọi để thiết lập đồng bộ hóa không chính xác. Hãy xem lệnh gọi trong bản trình diễn để biết ví dụ về những gì hoạt động.

Tôi hy vọng bạn thấy điều này hữu ích.

(Tôi đã làm điều này trên Android Studio 3.0 Canary 5. Tôi hy vọng đây không phải là một vấn đề.)

+0

Tôi đã phải thêm một cái gì đó ở đây như tôi đã gãi đầu của tôi cho một ngày hoặc lâu hơn trước khi đào xung quanh trong codebase AOSP. Pre-API 24 tần suất đồng bộ tối thiểu là 60 giây, nó sẽ luôn làm tròn lên. Bạn có thể thấy điều này từ các bản ghi (Tần suất thăm dò được yêu cầu của "+ runAtTime +" giây được làm tròn lên đến 60 giây.) Hoặc bằng cách xem các đồng bộ được trả về bởi ContentResolver.getPeriodicSyncs (tài khoản, CONTENT_AUTHORITY); Post-API 24 thời gian đồng bộ tối thiểu hiện là 15 phút. Vì vậy, tất cả các giá trị dưới đây sẽ được làm tròn tới 15 phút. – WillEllis

0

Một điều quan trọng cần nhớ là thời gian đồng bộ hóa định kỳ không được bảo đảm và có thể không chính xác, điều này được đề cập trong documentation:

Mặc dù các đồng bộ được dự kiến ​​ ở tần số nhất định, nó có thể mất nhiều thời gian hơn để nó thực sự là bắt đầu nếu các đồng bộ khác ở phía trước nó trong hàng đợi hoạt động đồng bộ hóa. Điều này có nghĩa là thời gian bắt đầu thực tế có thể trôi dạt.

Tôi cũng sẽ cố gắng để tạo ra các tài khoản sử dụng lý Tài khoản và không bằng cách tạo new Account()

manager.addAccountExplicitly(account, null, null) 

Và điều cuối cùng, nếu tài khoản này vừa tạo hơn bạn có thể muốn để buộc chỉ đồng bộ đầu tiên ngay sau khi bạn thiết lập đồng bộ hóa tự động:

if (accountJustCreated) { 
    SyncAdapter.performSync(); 
} 
+2

Mẹo cuối cùng của bạn là những gì tôi đã làm và làm việc tốt, nhưng một phần định kỳ không phải là wiorking ở tất cả mặc dù ContentResolver.addPeriodicSync (tài khoản, AUTHORITY, mới Bundle(), 7200); –

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