編輯:關於Android編程
1.為什麼需要性能優化?
上面說到,在時間窗口期內開發出產品是極端重要的,但是雖然基本功能我們實現了,但是開發出來的產品代碼運行的效率怎麼樣呢?我們的App用戶給用戶的體驗如何呢?
我們的App在低端機上經常ANR、閃退、卡頓等
我們的App在其他分辨率上顯示慘不忍睹?
我們的App在不同網絡的情況下如何處理的?
我們的App體驗如此之差,導致大量的用戶流失。這些迫使我們認識到性能優化是非常重要,某種程度上甚至超過了新功能的開發。
2性能優化四個方面:
-響應時間(Response Time)
-界面卡頓(ANR)
-耗內存(Memory)
-內存洩露(Out of memory)
響應時間
1)HTTP請求方式
這裡指的是客戶端與服務端交互,拿到數據、解析、再到顯示到界面整個過程耗費的時間。
這個部分涉及客戶端的優化,也涉及服務端的優化,這裡只討論客戶端。
使用優秀的開源Http框架是我們比較好的選擇,它的優點是經過市場的驗證. 加快響應速度(網絡請求框架)。
2)數據解析
實際開發當中服務端的返回數據格式無非就兩種:
- JSON
- XML
在Android中均可以使用優秀的解析庫來加快我們的解析速度,XML中有dom4j,JSON有Jackson、Gson,我們通過這些庫實現我們更快的完成數據解析,提高我們的開發效率。
3)數據存儲
為了提高應用程序的響應時間,數據緩存是一個比較好的方式,我們可以預處理服務器返回的數據,對數據進行緩存刷新。
優化點:
-異步請求網絡數據
-預處理服務器返回數據
-異步進行數據存儲操作
-數據緩存刷新
- Timeout超時重試
-在主線程中操作UI
界面卡頓
ANR表示”應用程序無響應”,這個是需要我們避免發生的事情,出現這個異常的原因:
-主線程(“事件處理線程”/“UI線程”)在5秒內沒有響應輸入事件
- BroadcastReceiver在10秒內沒有執行完畢
導致ANR的原因有很多,一般情況就是在UI線程做了耗時的操作,例如”網絡請求”、數據庫操作。
那麼如何避免?
-UI線程只做界面刷新,不做任何耗時操作,耗時操作放在子線程來做
-可以使用Thread+handle或者AsyncTask來進行邏輯處理
耗內存
每部手機的內存有限,我們這裡所說的內存指的是手機的RAM,它是Ramdom Access Memory的縮寫,我們應用程序的需要隨機讀寫的數據就存在RAM中,Android手機之所以會比較耗內存,這跟Android後台的處理有關,我們知道Android應用是使用Java開發的,運行Java需要有虛擬機,說明每開啟一個應用都會創建一個虛擬機,而這是需要內存的,所以我們開的應用越多,後台進程越多,內存都分配出去了,才導致內存消耗的嚴重。
隨機存取存儲器(random access memory,RAM)又稱作"隨機存儲器",是與CPU直接交換數據的內部存儲器,也叫主存(內存)。它可以隨時讀寫,而且速度很快,通常作為操作系統或其他正在運行中的程序的臨時數據存儲媒介。
其實這個問題我們是沒得破的,只要內存不夠,我們的應用還是會卡。我們開發的應用依賴與系統給我們分配的堆內存,一般上限在16M~48M,但我們可以通過在AndroidManifest設置Application屬性largeHeap=“true”來申請更多的堆內存。
可以通過代碼獲取可用堆內存限制
內存洩露
內存洩露這個問題已經被說爛了,大家都知道有內存洩露這個問題存在,但為什麼會發生內存洩露?
這裡的內存洩露並不是真正意思上的洩露,而是因為內存不足不能進行GC操作,從而導致占用內存過大,拋出out of memory異常,而被系統Kill掉。(內存洩露進而導致內存溢出)
3,如何進行性能優化?
前面講了一些背景知識,對我們理解內存優化有一定的幫助,下面就簡單說一下我們優化的方向:
-布局優化
-內存優化
布局優化
優化點:
-避免OverDraw
-優化布局層級
-避免過多無用嵌套
-使用標簽 重用layout
-使用延遲加載
- Hierarchy View進行層級分析
內存優化
內存優化的點有很多,這裡我主要分為兩大塊:
- Bitmap優化
-代碼優化
代碼優化
關於代碼這個就有的說了,任何能改進我們程序的優化點都能寫在這裡,這裡沒辦法把所有優化的點列在這裡,只提供相關的參考,剩下的就好各位經驗總結和積累了。
優化點:
- 對常量使用static修飾符
-使用靜態方法
-減少不必要的成員變量
-盡量不要使用枚舉,少用迭代器
-對Cursor、Receiver、Sensor、File等對象,要注意它們的創建、回收與注冊、反注冊
-避免大量使用注解、反射
-使用RenderScript、OpenGL來進行復雜的繪圖操作
-使用SurfaceView來替代View進行大量、頻繁的繪圖操作
-盡量使用視圖緩存,而不是每次都執行inflate()方法解析視圖
創建新的對象都需要額外的內存空間,要盡量減少創建新的對象。 將類、變量、方法等等的可見性修改為最小。針對字符串的拼接,使用StringBuffer替代String。 不要在循環當中聲明臨時變量,不要在循環中捕獲異常。 如果對於線程安全沒有要求,盡量使用線程不安全的集合對象。 使用集合對象,如果事先知道其大小,則可以在構造方法中設置初始大小。 文件讀取操作需要使用緩存類,及時關閉文件。 慎用異常,使用異常會導致性能降低。 如果程序會頻繁創建線程,則可以考慮使用線程池。
以上都是些經驗總結,大致都相差無幾,朋友們在做代碼優化的時候,可以根據這些優化點,有針對性去重構代碼,其實最重要還是代碼的可讀性,結構清晰。
性能優化工具
Memory Monitor -內存監視工具TraceView MAT
Android開發者對與以上幾個性能調優的工具一定不陌生,這裡我也不再寫那麼多廢話了,關於它們的使用方法,官網還有一些大牛的博客都有介紹。
寫這篇文章的出發點也是對Android性能優化有個比較清楚的認識,任何事情都不可能一蹴而就,需要循循漸進,對一個初學者你談優化很不現實,我們先把基本的做好,再去考慮相應的優化,筆者也在不斷學習當中,借鑒別人好的優化方案,提高產品的質量,感謝大家對筆者的關注。
性能優化技術,簡而言之,就是提高我們程序的性能,讓我們的應用更快,更少使用CPU資源,更少使用內存。
性能優化,一方面需要自身能力的提高,另外一方面,也需要有意識去學習優化技術,並應用於自身項目的開發中。
WebView是Android中一個非常實用的組件,它和Safai、Chrome一樣都是基於Webkit網頁渲染引擎,可以通過加載HTML數據的方式便捷地展現軟件的界面,
第4節 遠程調用之前提到過:如果站在Service與觸發Service運行的那個組件的角度,根據它們的關系進行分類,有兩種:本地Service,遠程Service。本地S
把github上的PagerSlidingTabStrip稍作修改: tab的文字顏色選中變色(原版文字不變色) 栗子:http://download.csdn.ne
前面我們介紹了AlertDialog和幾個常用的Dialog,ProgressDialog進度條提示框、DatePickerDialog日期選擇對話框和TimePicke