2013年7月17日 星期三

APP定期與SERVER同步資料應該要注意的事

今天一位國外開發者遇到他的應用在定期與 server 同步資料時,因為 2x Battery 會將網路斷開,而造成他的程式始終無法抓到資料,來信問我是否有解法。其實就算使用者沒裝 2x Battery, 手機上的網路還是隨時會處於無法連線的狀態。因此,真要寫一個定期 polling (or post) 的 app。我建議還是要寫個 broadcast receiver 監聽android.net.conn.CONNECTIVITY_CHANGE intent。如果上次同步沒成功,就可在連線恢復時,繼續上次的同步工作。

有興趣知道細節的,可先閱讀底下資料:

原先這文章是發佈在我的 facebook, 有位網友加入討論,我覺得值得在這分享我們的討論給大家。底下就是我們的後續討論:


Julian Shen: 這Intent使用上要稍微小心, 網路有變化就會收到(像是3G<->Wifi),在網路不穩定的環境下就很容易頻繁收到, 在這份 document : http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html 有特別提到"it's good practice to monitor this broadcast only when you've previously suspended updates or downloads in order to resume them."


盧育聖: Julian Shen 你說的沒錯。

Android's DownloadManager 就是靠 CONNECTIVITY_CHANGE 來恢復網路下載的工作。想深入研究的開發者,可參考底下 Android 原始碼的實作。

  • packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadReceiver.java
  • packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadService.java

盧育聖: 另外補充 Julian Shen 提到的會頻繁收到 CONNECTIVITY_CHANGE intent 問題的解法。實務上,這個 receiver 預設是處於 disabled (加 android:enabled="false") 狀態的,只有當你上次同步失敗時,才 enable 這個 receiver,同步好後,記得要 disable 該 receiver。

如何動態 enable/disable receiver,請見:

http://developer.android.com/training/monitoring-device-state/manifest-receivers.html


看到這,你是否有不同的想法或解決方法?也歡迎在此一起討論。

沒有留言:

張貼留言