Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用優化方案

Android應用優化方案

編輯:關於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資源,更少使用內存。

性能優化,一方面需要自身能力的提高,另外一方面,也需要有意識去學習優化技術,並應用於自身項目的開發中。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved