Android 開發時,如何實現和伺服器的數據同步 ?


與伺服器數據同步,不建議輪詢,做推送的話

2.2版以上用Google的C2DM,http://code.google.com/android/c2dm/。這樣一台手機上的所有應用共享一個長連接到Google伺服器,不用每個應用分別建立一個長連接到各自的伺服器端,省電;各應用的伺服器端均通過Google伺服器發推送通知到手機,與Apple的通知推送類似。

2.2之前的版本,可以考慮:

- 開源的AndroidPN http://sourceforge.net/projects/androidpn/

- IBM的MQTT:http://mqtt.org/,簡單例子見 http://tokudu.com/2010/how-to-implement-push-notifications-for-android/


使用http長連接是正道,可以避免N多由運營商導致的問題。


這個問題,分為兩部分,一個是客戶端數據有變化了就上傳,這個好說;第二個是伺服器端有變化了,客戶端要能知曉並從伺服器端拉取到數據。這個有幾種解決方法:

方法1:

定期從伺服器上輪詢和上傳,缺點是不實時,不優美。

方法2:伺服器通過發送簡訊告訴客戶端數據變化,客戶端再去拉取。缺點是費錢,客戶端在國外時貌似也不實時。

方法3:伺服器和客戶端建立Socket並保持心跳,優點是實時,缺點是耗電。

方法4:使用google的C2DM的Push服務,這是方法3的升級版,很不錯,但缺點是每個手機上都需要一個google帳號,才能使用該服務。


1、同步時間:首先要考慮需求,是不是一定要實時數據,如果數據不要求實時允許有延遲:客戶端添加同步點,例如每次請求數據的時候都會附帶請求是否有需要同步的數據,軟體每次打開時同步一次,每次登陸時同步一次,再加上手動同步,基本滿足需求。

2、同步內容:如果客戶端當前用戶可以唯一標識(比如需要登錄),應該把數據比對放到服務端,也就是客戶端現在有哪些數據服務端應該是知道的,通過時間戳和同步表(記錄哪個表增刪改查了哪條數據)來雙向同步。有一個原則,能在服務端做的事就不要放客戶端。

3、同步方式:我們用的是hessian(http、二進位),效率還行,也可以直接走json,需要實測網速以及同步數據塊大小來決定採取哪種方式。


兩種方式:

1.輪詢,定一個時間循環向伺服器發送請求,接收到數據後刷新界面,這樣伺服器和客戶端做的事情太多,壓力太大,不建議

2.註冊靜態廣播,接受推送下來的消息,接收到推送後,獲取數據刷新界面,建議使用這種實現方法


對業務數據表,建相對應的更新記錄表(索引,更新時間,操作人,動作類型...)。同步的時候通過WebService讀取伺服器更新表的更新時間=客戶端的更新時間,下面的行就是有改動的。然後更新。


參考Sync ML協議


搜索下xmpp,網上有很多開源的項目可以實現


數據同步指的是數據一致性嗎?協議設計數據上,需要在通訊時交換snapshot 或者 oplog;協議設計交互上,有輪詢和通知兩種。


個人感覺,要實現push的話,必須有某種形式的長連接,至於選何種形式的長連接,可以根據具體的應用場景再來篩選


不考慮其他原因,純技術的話優先用google的推送,其次長連接,輪詢。伺服器負載很大的系統,傾向還是讓終端多幹些事情吧。


方法1: 定期從伺服器上獲取和上傳,缺點是不實時,不優美。

方法2:伺服器發送消息告訴客戶端數據變化,客戶端從新獲取數據。缺點是費錢,客戶端

在國外時也不實時。

方法3:伺服器和客戶端建立Socket鏈接,優點是實時,缺點是耗電。每隔3分鐘,客戶端就向伺服器發送一個心跳包;

伺服器收到以後,記錄當前的收到該客戶端心跳包的時間。

伺服器有一個心跳檢測線程,

當一個客戶端連接連續9分鐘沒有收到心跳包,

則認為該連接已經斷開了。

方法4:使用google的C2DM的Push服務,這是方法3的升級版,缺點是每個手機上都需要一個google帳號,才能使用該服務。


jetty實現http長連接,我所知道的比較好的做法


推薦閱讀:

Android Studio連接真機沒反應?
Android開發中,有哪些讓你覺得相見恨晚的方法、類或介面?
Android開發中,如何有效解決ScrollView和ListView衝突?
關於 Android,用多個 activity,還是單 activity 配合 fragment?
怎麼可以快速的學會並掌握Android開發?

TAG:Android開發 | 開發時間 | Android |