2012-02-13 32 views
8

Tôi đã triển khai SyncAdapter, AccountManager và ContentProvider riêng tư dọc theo các dòng của dự án mẫu SimpleSyncAdapter trong SDK. Tất cả đều hoạt động tốt.Gọi lại Android SyncAdapter

Bây giờ tôi muốn hiển thị một thông báo cho người dùng khi các hàng mới đã được tải xuống từ máy chủ từ xa có một bộ cờ cụ thể. Tôi cần một cuộc gọi lại từ SyncAdapter khi đồng bộ hóa đã kết thúc để tôi có thể thực hiện truy vấn và hiển thị thông báo từ một hoạt động. Tôi đã thấy một vài câu hỏi trên StackOverflow thảo luận về điều này nhưng không có câu trả lời nào tốt.

How does one listen for progress from Android SyncAdapter? nói rằng SyncStatusObserver là vô ích. Người dùng mobibob đề xuất sử dụng ResultReceiver để phản hồi lại giao diện người dùng từ chuỗi đồng bộ hóa.

How to know when sync is finished? đề xuất sử dụng Mục đích trong SyncService của bạn.

How to signal sync-complete to the Android SyncManager? đề nghị sử dụng SyncResult. Mã ví dụ được liên kết bởi maxpower47 sử dụng lớp SyncResult để báo cáo ngoại lệ nhưng không thực sự báo cáo nếu đồng bộ hóa được hoàn tất thành công.

Tôi chỉ không biết tùy chọn nào là tốt nhất và tôi chưa thấy bất kỳ dự án mẫu nào khi sử dụng bất kỳ giải pháp nào trong số này.

+0

Ở chính xác cùng một vị trí - bạn có quản lý để làm việc không? – HGPB

Trả lời

1

Tôi biết đây là một câu hỏi cũ, nhưng tôi cũng đã tự hỏi bản thân mình. gì tôi phát hiện ra như một giải pháp tốt, đặc biệt bởi vì tôi đang đối phó với dữ liệu địa phương như bạn đang có, là sử dụng các phương pháp sau đây từ ContentResolver:

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

này đăng ký một lớp quan sát mà có được gọi lại khi dữ liệu xác định bởi một thay đổi URI nội dung đã cho. Nhưng điều đó chỉ có thể xảy ra nếu ContentProvider của bạn gửi thông báo. Vì vậy, ví dụ, nếu bạn muốn nhận được thông báo trên ContentObserver trên cho tất cả các cập nhật được thực hiện trên cơ sở dữ liệu của bạn thông qua một ContentProvider, ContentProvider bạn nên thực hiện cập nhật tương tự như sau:

@Override 
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { 
    // code goes here 
    this.getContext().getContentResolver().notifyChange(uri, null); 
    return 0; 
} 

Sử dụng notifyForDescendents khi bạn làm một registerContentObserver có thể rất hữu dụng.

1

Đây là câu hỏi cũ nhưng tôi đã thực hiện một số nghiên cứu trong những ngày qua và không có nhiều ví dụ về yêu cầu mạng xử lý syncAdapter và thông báo cho giao diện người dùng.

Trước tiên, bạn nên sử dụng Trình tải với trình ContentProvider để làm cho cuộc sống của bạn dễ dàng hơn. Bạn không cần phải đăng ký cho trình phân giải nội dung nữa Trình tải sẽ thực hiện nó cho bạn. Vì vậy, nó có nghĩa là giao diện người dùng của bạn được thông báo cho bất cứ điều gì mà đi vào nhà cung cấp nội dung của bạn.

Điều gì sẽ xảy ra nếu không có gì thay đổi? mọi thứ đã được cập nhật hoặc bạn gặp lỗi mạng.

  1. Bạn có thể nghe tình trạng của SyncAdapter của bạn như Google I/O ứng dụng làm, tìm kiếm mSyncStatusObserver trong BaseActivity
  2. tôi đã có một cái nhìn tại các ứng dụng email Android mặc định và họ sử dụng một Singleton với callBacks.
  3. Bạn có thể BroadcastIntents hoặc sử dụng eventBus (square Otto for exemple) để thông báo cho UI của bạn về bất kỳ hành vi nào.

Tôi thích cái cuối cùng tốt hơn vì nó cung cấp cho bạn chi tiết hơn về các sự kiện xảy ra trong syncAdapter.

+0

Bạn có bất kỳ ví dụ nào về việc sử dụng Otto với SyncAdapter không? – toobsco42

+0

Xin lỗi tôi hiện không có, tôi có [dự án mẫu] (https://github.com/sebastienrouif/notesSyncAdapter) trong đó trong SyncHelper.java ngoài việc đánh bắt các lỗi bạn có thể gửi các lỗi sự kiện. Về phía giao diện người dùng, đó là xử lý sự kiện thông thường. – Sebastien

+0

rực rỡ Sebastien !! +1 –

-2

Chúng tôi đã gặp phải tình huống tương tự và đã viết giao diện Trình lắng nghe tĩnh vào SyncAdapter. Người nghe là hoạt động và thực hiện các hành động cần thiết khi dữ liệu có sẵn (cập nhật giao diện người dùng). Điều này cũng hoạt động khi bộ điều hợp đồng bộ được gọi bởi hệ thống trong quá trình tự động đồng bộ, nơi người nghe này sẽ là rỗng và quy trình đồng bộ sẽ lưu ý đến hoạt động kinh doanh của chính nó.

class SyncAdapter extends AbstractThreadedSyncAdapter { 

    protected static Listener uiListener = null; 
    public interface Listener { 
     public void onSync(); 
    } 
    public static void setListener(Listener l) { 
     uiListener = l; 
    } 
    public static void clearListener() { 
     uiListener = null; 
    } 
    protected void broadcastSync() { 
     if (uiListener != null) 
      uiListener.onSync(); 
    } 
    public void onPerformSync(Account account, Bundle extras, String authority, 
          ContentProviderClient provider, SyncResult syncResult) { 

     // call broadcastSync(); 
    } 

Sau đó, trong Hoạt động, triển khai giao diện SyncAdapter.Listener.

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