創造優秀的 Android 應用離線體驗
最近幾年,Google、Microsoft、非死book 等公司都不約而同的盯上了非洲大陸。為了能更好服務像這樣網絡條件很差的用戶,作者在這里分享了你可以怎樣組織自己 Android 應用的離線架構。
為什么我得考慮這些?
出色的應用必然有著出色的用戶體驗。用戶不會在乎網絡的好壞,只會看到你的應用卡住,然后卸載掉你的應用。因此真正的挑戰是為這些網絡狀況不佳的用戶設計具有優秀用戶體驗的應用。
應該怎么做?
1.確定連接
作者推薦使用 非死book’s Network Connection class 來監聽當前應用的網絡狀況。如果你用到了 OkHttp ,可以結合下面的代碼來使用:
public class SamplingInterceptor implements Interceptor
{
@Override
public Response intercept(Chain chain) throws IOException
{
Request request = chain.request();
DeviceBandwidthSampler.getInstance().startSampling();
Response response = chain.proceed(request);
DeviceBandwidthSampler.getInstance().stopSampling();
return response;
}
}
2.高效緩存
高效緩存和重用之前獲取的資源的能力是優化性能的關鍵,關于 HTTP 緩存策略可以看看 這里 。
3.本地操作,全局同步(Act locally, sync globally)
使模型持久化,當服務器有新的數據時,首先更新 Presenter 層,同時通知視圖進行更新。這里推薦通過 EventBus 來實現。同樣,當你需要將數據發送給服務器時,先更新數據到 Presenter 層并更新界面,再上傳至服務器。不要顯示進度條,并等待服務器相應后再更新界面。如果設備處于離線狀態,那么就在恢復在線狀態后重試。可以嘗試用 Evernote 的 AndroidJob 來簡化任務調度。
如果你還不了解什么是 Presenter,先看看 Google 的 Android 應用架構藍圖 吧。: )
4.高效的線程
數據交互會需要額外的線程,但你要避免創建太多的線程。對于網絡任務和本地任務,應當各自有一個單獨的隊列,你不會希望掛起的網絡任務成為本地任務的瓶頸。這里推薦使用 RxJava 來幫助處理線程調度 。
5.圖像優化
根據網絡狀況控制要獲取的圖像質量,推薦默認使用 RGB_565 的圖片壓縮參數,如果網絡情況允許再去請求更高質量的圖像。
6.使用 Big Cookie model
對于 Android 設備,完全工作的無線網絡功能有著較大的功耗,因此在 Android 中有著不同的網絡連接狀態以節省能耗,但當 Android 在創建一個新的網絡連接時,網絡模塊會轉換到全功率狀態。因此,考慮到這點,你應當盡可能的選擇一個合適的時間點一次性提交你的數據,以確保消耗盡可能小的功耗。也就是在每次傳輸會話期間傳輸盡可能多的數據(big cookie),以避免創建小而頻繁的網絡連接。
來自:https://zhuanlan.zhihu.com/p/24340160