Android開發性能如(rú)何優化

2019-08-23

布局優化在Android開發時,如(rú)果創建的(de)布局層次結構比較複雜,View樹嵌套的(de)層次比較深,會使頁面展現的(de)事件比較長(cháng),導緻應用運行起來越來越慢,所以需要進行布局優化。

 3D-Best-Android-Wallpaper-Desktop.png1.include标簽共享布局:
将通用的(de)布局抽取出來,獨立成一(yī)個XML文件,在需要用到的(de)頁面中使用include标簽引入進來,減少代碼量,便于修改。
 2.ViewStub标簽實現延遲加載:
ViewStub是一(yī)種不可(kě)視(shì)并且大小為(wèi)0的(de)視(shì)圖,可(kě)以延遲到運行時才填充布局資源。當ViewStub設置為(wèi)可(kě)見或者被inflate之後,會填充布局資源,ViewStub會被填充的(de)視(shì)圖代替,和(hé)普通的(de)視(shì)圖沒有區别。
ViewStub在需要顯示的(de)時候才會進行視(shì)圖的(de)填充,實現延遲加載的(de)目的(de)。


 3.merge标簽減少布局層次:

當一(yī)個獨立的(de)布局文件最外層是FrameLayout且這個布局不需要設置背景等屬性時或者當前布局是另外一(yī)個布局的(de)子(zǐ)布局時,可(kě)以使用merge來減少布局的(de)層次。
 

4.盡量使用CompoundDrawable:

在LinearLayout布局中,如(rú)果存在相鄰的(de)ImageView和(hé)TextView,可(kě)以使用compound drawable合二為(wèi)一(yī)成為(wèi)一(yī)個TextView,ImageView中的(de)圖片變成TextVIew的(de)drawableTop/drawableLeft/drawableRight/ddrawableBottom屬性,之間的(de)間隔使用drawablePadding屬性來代替。
 
5.使用
Lint: Lint也可(kě)以用來檢查應用的(de)布局是否存在可(kě)優化的(de)地(dì)方,為(wèi)優化布局設置的(de)規則如(rú)下:
AndroidLintUseCompoundDrawables:盡量使用CompoundDrawable。 MergeRootFrame:使用merge标簽減少布局層次。 TooManyViews:單個布局中存在太多的(de)View,默認情況下,單個布局中View的(de)個數最多隻能是80個,可(kě)以考慮使用CompoundDdrawables等來減少View的(de)個數。 TooDeepLayout:避免過深的(de)布局嵌套,默認情況下,單個布局中最多層級是10,可(kě)以考慮使用RelativeLayout來減少布局的(de)層次。 UselessParent:當一(yī)個布局不是一(yī)個SrcollView或者根布局,
隻有一(yī)個子(zǐ)View且沒有設置背景時可(kě)以将它移除掉,并将它的(de)子(zǐ)View移動到它的(de)父容器中,得到更扁平的(de)布局層次。
**NestedWeights:**android:layout_weight屬性會使得View控件被測量兩次,當一(yī)個LinearLayout擁有非0dp值的(de)android:layout_weight屬性,這時如(rú)果将它嵌套在兩一(yī)個擁有非0dp的(de)android:layout_weight的(de)LinearLayout,這時測量的(de)次數将呈指數級别增加。


UselessLeaf:一(yī)個布局如(rú)果沒有子(zǐ)View也沒有設置背景,通常可(kě)以移除它,可(kě)以得到更扁平和(hé)高(gāo)效的(de)布局層次。

InefficientWeight:當LinearLayout中隻有一(yī)個子(zǐ)View定義了android:layout_weight屬性,更高(gāo)性能的(de)做(zuò)法是使用0dp的(de)android:layout_height或者android:layout_weidth來替換它,這個子(zǐ)View就不需要測量它自(zì)身對應的(de)大小。

網絡優化
網絡優化可(kě)以節省網絡流量,節省電量,提高(gāo)應用的(de)響應。
1.避免DNS解析:
DNS是域名系統,根據應用請求所用的(de)域名URL去(qù)網絡映射表中查找對應的(de)IP地(dì)址,這個過程可(kě)能會需要上百毫秒的(de)時間,可(kě)能會存在DNS劫持的(de)危險。所有根據具體的(de)業務需求,可(kě)以采用增加動态更新能力的(de)IP方式,或者在IP方式訪問失敗時切換到域名訪問方式。
2.合并網絡請求:
對于網絡請求應該盡量減少請求的(de)接口,能夠合并的(de)網絡請求就盡量合并。
3.預先獲取數據:
預先獲取數據能夠将網絡請求集中在一(yī)次,其他時間段手機就可(kě)以切換到空閑狀态,避免經常性的(de)喚醒和(hé)空閑,起到節省電量的(de)作用。
4.避免輪詢:
輪詢是指客戶端每隔一(yī)段時間就向服務端主動發起的(de)網絡請求,存在需要的(de)數據就拉取,沒有就等待下一(yī)次輪詢。一(yī)般情況下能使用推送替換的(de)盡量使用推送,避免使用Thread.sleep()函數循環等待,可(kě)以使用系統AlarmMananger實現定時輪詢。
5.優化重連機制:
盡量避免網絡請求失敗時,無限制循環重試連接,可(kě)以設定一(yī)個最大重連次數,超過次數限制之後結束重連,等一(yī)段時間後再嘗試連接。
6.離(lí)線緩存:
對于圖片,文件等數據,可(kě)以使用二級緩存策略,當緩存中有對應的(de)圖片或者文件時,可(kě)以直接從緩存中讀取,不需要網絡請求,避免網絡延遲,節省流量。
7.壓縮數據大小:
對于客戶端來說,可(kě)以對發送給服務器的(de)數據進行gzip壓縮,同時可(kě)以選用更優的(de)數據傳輸格式來減少網絡上面傳輸的(de)數據。
8.不同的(de)網絡環境使用不同的(de)超時策略:
可(kě)以通過監聽 ConnectivityMananger.CONNECTIVITY_ACTION的(de)變化來獲取最新的(de)網絡類型,動态調整網絡超時時間。
9.CDN的(de)使用:
CDN,內(nèi)容發布網絡,盡可(kě)能避免網絡上可(kě)能影響數據傳輸速度和(hé)穩定性的(de)環節,實現更快,更穩定的(de)數據傳輸,其中CDN加速能夠緩解電信核心網絡延遲帶來的(de)影響。

責任編輯:中山網站建設
 【網訊網絡】國(guó)家高(gāo)新技術企業》十年(nián)專注軟件開發,網站建設,網頁設計,APP開發,小程序,微信公衆号開發,定制各類企業管理(lǐ)軟件(OA、CRM、ERP、訂單管理(lǐ)系統、進銷存管理(lǐ)軟件等)!
服務熱線:0760-88610046、13924923903,http://www.wansion.net

您的(de)項目需求咨詢熱線:0760-88610046(國(guó)家高(gāo)新技術企業)

*請認真填寫需求,我們會在24小時內(nèi)與您取得聯系。