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是唯一的全局變量(指的是使用者資訊,登入後擷取到的,用戶端是應該長期緩存的,除非登出登入)。