Thiết kế để đồng bộ hóa dữ liệu trong Android


23

Tôi đã thấy hai triển khai để đồng bộ hóa dữ liệu giữa máy chủ và máy khách trên phần lớn các ứng dụng. Điều này giả định không có GCM nào được thiết lập: -

  1. Chạy một dịch vụ mục đích định kỳ tải dữ liệu từ mạng và lưu trữ trong cơ sở dữ liệu.
  2. Thực hiện Bộ điều hợp đồng bộ chạy định kỳ.

Bạn muốn giới thiệu cái nào ở trên trong ứng dụng của mình và tại sao?

Câu trả lời:


12

Lưu ý: Bộ điều hợp đồng bộ hóa chạy không đồng bộ, vì vậy bạn nên sử dụng chúng với mong muốn chúng truyền dữ liệu thường xuyên và hiệu quả, nhưng không tức thời. Nếu bạn cần thực hiện chuyển dữ liệu theo thời gian thực, bạn nên thực hiện trong AsyncTask hoặc IntentService. - nguồn .

Về cơ bản, nếu bạn cần chuyển thời gian thực, hãy sử dụng IntentService (tùy chọn đầu tiên), khác SyncAd CHƯƠNG. Tôi thích một IntentService hơn vì nó cảm thấy có thể tùy chỉnh nhiều hơn, nhưng một cách tiếp cận tầm thường hơn sẽ là sử dụng SyncAd CHƯƠNG.


18

Nó phụ thuộc rất nhiều vào loại đồng bộ hóa bạn cần.

Định kỳ

Nếu ứng dụng của bạn là một ứng dụng tin tức xuất bản bài đăng vào một thời điểm nhất định mỗi ngày (giả sử vào lúc 7,45 sáng mỗi ngày), thì bạn sẽ chạy một nhiệm vụ định kỳ trong dịch vụ nền, nói vào lúc 8 giờ sáng.

vd : nhỏ giọt. Họ thông báo cho tôi mỗi ngày một lần (khoảng 6h30). Tôi tin rằng họ sử dụng một nhiệm vụ định kỳ.

Sự kiện đã được bắt đầu

Nếu việc truyền dữ liệu của bạn được kích hoạt bởi hành động của người dùng, thì hãy sử dụng dịch vụ nền hoặc AsyncTask để truyền dữ liệu.

ví dụ : DropBox / Evernote. Chúng đồng bộ khi tôi tương tác với ứng dụng.

Tức thời

Nếu ứng dụng của bạn chạy tin nhắn tức thời / thư / cập nhật quan trọng không định kỳ , thì bạn cần thông báo đẩy, vì bạn muốn cảnh báo người dùng ngay lập tức. Sử dụng GCM hoặc Parse cho trường hợp này. ví dụ: trò chuyện WhatsApp / Google. Vì bạn đã đề cập rõ ràng rằng bạn không muốn sử dụng GCM, tôi sẽ cho biết lý do tại sao bạn nên sử dụng nhà cung cấp thông báo đẩy tiêu chuẩn thay vì viết riêng:

Thông báo đẩy hoạt động tức thời - có rất ít độ trễ (theo thứ tự giây, hiếm khi là vài phút). Nếu bạn thực hiện giải pháp / thư viện của riêng mình để thực hiện việc này - trong một mô hình ngây thơ, bạn sẽ ping máy chủ mỗi giây hoặc 5 giây hoặc một phút để kiểm tra trạng thái. Điều này rất không hiệu quả vì nó tiêu thụ CPU (và do đó là pin), băng thông trên điện thoại di động và tải trên máy chủ của bạn. Tuy nhiên, trong GCM / Parse, họ luôn giữ một cổng mở với máy chủ (xem tại đây ). Đây là cách tiêu chuẩn và hiệu quả nhất. Ngoài ra, nếu 10 ứng dụng sử dụng GCM, bạn không cần 10 kết nối mở, bạn chỉ cần một kết nối cho mỗi thiết bị. Và bạn thực sự không muốn phát triển giải pháp của riêng mình trừ khi bạn có lý do / tiền / thời gian hợp lệ để làm việc đó.

Một lưu ý về Bộ điều hợp đồng bộ : Bộ điều hợp đồng bộ hoạt động tốt cho cả ba trường hợp trên. Kiểm tra Chạy Bộ điều hợp đồng bộ hóa và bạn sẽ thấy rằng nó phụ thuộc vào GCM hoặc cơ chế của riêng bạn (trình kích hoạt sự kiện hoặc giải pháp tùy chỉnh) hoặc tính khả dụng của mạng (trình kích hoạt sự kiện) hoặc sự kiện định kỳ. Nói chung, đây là một lớp thuận tiện tốt để đồng bộ hóa dữ liệu mà không phải thực hiện một danh sách dài các khởi tạo mỗi lần hoặc để thực hiện tất cả các trường hợp trên tại một nơi.


Là một câu hỏi mở rộng, nếu tôi cần cập nhật tỷ số trực tiếp của trận đấu, kịch bản tức thời có phải là kịch bản phù hợp cho bối cảnh này không? Tôi có một màn hình có chi tiết trùng khớp và trong khi người dùng ở trên màn hình đó, điểm số sẽ tự động được cập nhật mà không cần đồng bộ hóa hoặc cập nhật thủ công. Vì vậy, gcm sẽ là bước đi đúng đắn phía trước?
gaara87

@AkashRamani Tôi không thấy lý do tại sao bạn không nên sử dụng GCM / Parse cho trường hợp này. Tuy nhiên, GCM là miễn phí trong khi Parse thanh toán cho bạn vượt quá một điểm nhất định. Nếu các cập nhật của bạn nằm trong khoảng 4096 byte, thì bạn có thể gửi cập nhật trực tiếp. Nếu cập nhật điểm số của bạn rất thường xuyên, thì việc bỏ phiếu có thể là một ý tưởng tốt thay vì GCM (giả sử, đối với điểm số của môn cricket). Tôi sẽ đề nghị kiểm tra / hồ sơ cả bỏ phiếu và GCM cho độ trễ và mức tiêu thụ CPU / pin.
Sundeep

AWS cũng có một giải pháp thông báo là đa nền tảng và thị trường chéo. Xem: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

Có một khía cạnh của một SyncAdaptercâu trả lời chưa được đề cập bởi các câu trả lời khác.

Các SyncAdaptermô hình đòi hỏi bạn phải có một cụ ContentProvider quyền mà bạn đồng bộ hóa đến và đi một loại tài khoản cụ thể (xem Authenticator ) đó sẽ được đồng bộ hóa. Vì vậy, trừ khi bạn đã có các thành phần đó trong kiến ​​trúc của mình (ví dụ: vì bạn cấp cho các ứng dụng khác quyền truy cập vào dữ liệu của bạn hoặc bạn cần hỗ trợ tài khoản), điều SyncAdapternày sẽ gây ra chi phí triển khai đáng kể.


2

Khi nói đến việc đồng bộ hóa dữ liệu liên quan đến kết nối, bạn cũng muốn có thể mở rộng quy mô. Tôi tin rằng cách được đề xuất là sử dụng Bộ điều hợp Đồng bộ hóa.

Nó cũng có vẻ là như vậy nếu bạn xem hướng dẫn traning Android: Tạo Bộ điều hợp đồng bộ hóa

Thành phần bộ điều hợp đồng bộ hóa trong ứng dụng của bạn đóng gói mã cho các tác vụ truyền dữ liệu giữa thiết bị và máy chủ. Dựa trên lịch trình và trình kích hoạt bạn cung cấp trong ứng dụng của mình, khung bộ điều hợp đồng bộ hóa chạy mã trong thành phần bộ điều hợp đồng bộ hóa ...


2

Bộ điều hợp đồng bộ hóa nên được sử dụng trừ khi bạn cần dữ liệu thời gian thực bởi vì, Nó tự động chuyển dữ liệu dựa trên nhiều tiêu chí khác nhau, như thay đổi dữ liệu, thời gian trôi qua, thời gian trong ngày, v.v. chuyển dữ liệu từ các ứng dụng khác, làm giảm việc sử dụng pin.

Đối với các tác vụ tức thời, chúng ta có thể sử dụng,

AsyncTask cho tác vụ có thời lượng ngắn, có thể là 3-4 giây.

IntentService cho các tác vụ chạy dài.


Sự cố lớn cho quy tắc lựa chọn ngón tay cái.
Brill Pappin

0

Vì chúng ta đang nói về thiết kế, chúng ta nên đề cập đến việc quản lý SyncAd chương, đối tượng SyncResult và những gì xảy ra sau đó.

Tôi thực sự sử dụng SyncAd CHƯƠNG để nói với thư viện của mình thực hiện các cuộc gọi web IntentService đến máy chủ của tôi. Quản lý hoạt động "đồng bộ hóa" này là khó khăn.

Một cách tiếp cận tôi hiện đang thực hiện là từ bỏ hoàn toàn đối tượng SyncResult và chỉ sử dụng một dịch vụ để ghi lại kết quả của từng "Sync" riêng lẻ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.