天天看點

第三章 經典場景設計

ImageLoader的知識點講的比較老,暫不總結(題外話:推薦Glide或者Fresco,但是一定要進行二次封裝,否則誰知道哪天心血來潮,想着換個架構試試呢)

圖檔加載利器Fresco:

配置檔案配置:

在application中進行初始化:

将程式中顯示圖檔的ImageView替換為SimpleDraweeView,并添加fresco命名空間:

在activity或者fragment裡面加載網絡圖檔:

Image pipeline工作流:

第三章 經典場景設計

Freso三層緩存概念:

bitmap緩存:5.0,bitmap緩存在heap堆中。

4.0及以下:bitmap位于ashmem中,而不是java的heap中,不會因為圖檔建立,回收引發過多gc,當App切換到背景,會清空bitmap緩存。

記憶體緩存:存儲圖檔原始壓縮格式,從記憶體中取出來并解碼,切換背景,清理記憶體緩存。

磁盤緩存:存儲在本地,不會丢失。

網上fresco中文文檔可以看下:http://fresco-cn.org/docs/index.html#_

資料進行壓縮處理進行傳輸,使用Gzip

傳輸格式使用json或者protobuffer

盡可能将一個頁面的多個資料請求進行合并處理

使用長連接配接代替http請求

離開頁面,取消請求(這方面比如我以前用的volley,現在用的okhttp都有提供方法來取消,一般将取消操作統一封裝在基類的onDestory()裡面)。

建立重試機制。一般設定重試三次的操作,隻針對get,post要防止重試。

圖檔流量優化:

用戶端可以通過傳遞寬高,來讓伺服器端對圖檔進行裁剪,并擷取符合目前顯示控件的的圖檔,相對應的對伺服器端的壓力比較大。

針對2G以及3G使用者降低圖檔的品質,進而減少圖檔占據的流量。

其實如果應用對圖檔的要求不是很高的話,可以控制應用在2G,3G的網絡環境不加載圖檔,而在wifi的情況下加載,當然最好在應用裡面設定個可選項供使用者選擇。

城市清單資訊,一般包括以下内容:

cityid 城市id

cityname 城市名稱

pinyin 城市拼音

jianpin 城市簡拼音

(題外話,一般項目中有兩種方式來擷取城市清單資訊:

1,直接db檔案或者json檔案,

2,每次從伺服器端擷取,但是序列化本地,讀取的時候從緩存檔案裡面讀取

對于2的問題,其實還是有個問題存在的,就是你每次都去序列化這些内容嗎,或者說每次都從伺服器端擷取緩存資料庫或者檔案裡面嗎,很明顯是不明智的。

書裡面針對上面的問題,其實在json結構設計的時候進行比較合适的方式來進行解決:

isMatch:表示是否本地version和伺服器端城市清單資訊的version一緻。

version:城市清單資料的版本資訊。

citys:城市清單資料。

給城市清單的json資料加上version字段,如果version字段不變化,第二次就不去更新這些内容,當version字段發生變化額時候,再對資料進行遞增。

App這邊的政策:

本地存儲發版前最新的城市清單資訊,包含版本資訊;

擷取城市清單的時候,将本地城市資訊清單裡面版本資訊帶到接口裡面,根據傳回的時候,isMatch的字段來判斷是否和伺服器端一緻,如果一緻,讀取用戶端緩存資料,不一緻解析并緩存最新的城市清單資料。

接口調用失敗,讀本地緩存城市清單資料。

開gzip壓縮,確定傳輸資料量最少。

無論是解析還是讀取本地緩存的城市資訊,一定要異步處理,否則很容易卡頓。

分為2種情況:

原有的表資料要進行修改。

有新增的城市清單資料。

接下來的方案也是針對這兩種情況進行處理的:

第三章 經典場景設計

存在對城市資訊的操作由三種:

增加新城市資訊;

删除無效的城市資訊;

更新已有的城市資料;

解決方法:

給城市資訊加上type類型:

delete 删除 删除指定cityid的城市資訊

update 更新 更新某cityid的城市資訊

add 增加 增加新的城市資訊

html5和native直接靈活切換:

兩套界面 native html5各一套,通過接口裡面字段控制是展示native還是html5界面。

政策:

背景根據版本配置決定頁面是通過native還是htm5頁面進行展示和互動。

在app啟動的時候,擷取頁面是html5還是native頁面。

頁面跳轉實作松耦合,設計個NavigatorManager類,來控制項目裡面所有頁面跳轉操作。

當app切換到背景,之前存放的全局變量會很容易回收,如果切換回前台,可能會因為使用某個全局變量,但這時變量為null而崩潰。

解決辦法:

序列化。

使用intent來進行資料傳遞(缺點,不能攜帶資料量大的資料)。

将資料序列化到本地,如果記憶體中的變量回收,就從本地去擷取。

上面方案的問題:

強制執行序列化操作,容易ANR。

序列化生成的檔案,會因為記憶體不足丢失。

JsonObject ,JsonArray不支援序列化,HashMap<String, Object>不一定支援序列化,ArrayList<HashMap<String, Object>>不一定支援序列化。

2的臨時解決方案:

使用完,清空,然後強制序列化到本地,確定本地檔案體積減少。

3的解決方案:以字元串序列化到本地;HashMap<String, Object>,ArrayList<HashMap<String, Object>>建議Object轉為String,否則就要周遊将Object轉換為String。

onSaveInstanceState()

onRestoreInstanceState()

User是唯一的全局變量(指的是使用者資訊,登入後擷取到的,用戶端是應該長期緩存的,除非登出登入)。