Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android] Android開發優化之——從代碼角度進行優化

[Android] Android開發優化之——從代碼角度進行優化

編輯:關於Android編程

通常我們寫程序,都是在項目計劃的壓力下完成的,此時完成的代碼可以完成具體業務邏輯,但是性能不一定是最優化的。一般來說,優秀的程序員在寫完代碼之後都會不斷的對代碼進行重構。重構的好處有很多,其中一點,就是對代碼進行優化,提高軟件的性能。下面我們就從幾個方面來了解Android開發過程中的代碼優化。   1)靜態變量引起內存洩露 在代碼優化的過程中,我們需要對代碼中的靜態變量特別留意。靜態變量是類相關的變量,它的生命周期是從這個類被聲明,到這個類徹底被垃圾回收器回收才會被銷毀。所以,一般情況下,靜態變量從所在的類被使用開始就要一直占用著內存空間,直到程序退出。如果不注意,靜態變量引用了占用大量內存的資源,造成垃圾回收器無法對內存進行回收,就可能造成內存的浪費。 先來看一段代碼,這段代碼定義了一個Activity。 private static Resources mResources;  @Override protected void onCreate(Bundle state) { super.onCreate(state); if (mResources == null) {     mResources = this.getResources();     } }   這段代碼中有一個靜態的Resources對象。代碼片段mResources = this.getResources()對Resources對象進行了初始化。這時Resources對象擁有了當前Activity對象的引用,Activity又引用了整個頁面中所有的對象。 如果當前的Activity被重新創建(比如橫豎屏切換,默認情況下整個Activity會被重新創建),由於Resources引用了第一次創建的Activity,就會導致第一次創建的Activity不能被垃圾回收器回收,從而導致第一次創建的Activity中的所有對象都不能被回收。這個時候,一部分內存就浪費掉了。   經驗分享: 在實際項目中,我們經常會把一些對象的引用加入到集合中,如果這個集合是靜態的話,就需要特別注意了。當不需要某對象時,務必及時把它的引用從集合中清理掉。或者可以為集合提供一種更新策略,及時更新整個集合,這樣可以保證集合的大小不超過某值,避免內存空間的浪費。       2)使用Application的Context 在Android中,Application Context的生命周期和應用的生命周期一樣長,而不是取決於某個Activity的生命周期。如果想保持一個長期生命的對象,並且這個對象需要一個Context,就可以使用Application對象。可以通過調用Context.getApplicationContext()方法或者Activity.getApplication()方法來獲得Application對象。 依然拿上面的代碼作為例子。可以將代碼修改成下面的樣子。 private static Resources mResources;  @Override protected void onCreate(Bundle state) { super.onCreate(state); if (mResources == null) {     // mResources = this.getResources();     mResources = this.getApplication().getResources();     } }       在這裡將this.getResources()修改為this.getApplication().getResources()。修改以後,Resources對象擁有的是Application對象的引用。如果Activity被重新創建,第一次創建的Activity就可以被回收了。   3)及時關閉資源 Cursor是Android查詢數據後得到的一個管理數據集合的類。正常情況下,如果我們沒有關閉它,系統會在回收它時進行關閉,但是這樣的效率特別低。如果查詢得到的數據量較小時還好,如果Cursor的數據量非常大,特別是如果裡面有Blob信息時,就可能出現內存問題。所以一定要及時關閉Cursor。 下面給出一個通用的使用Cursor的代碼片段。 Cursor cursor = null; try{     cursor = mContext.getContentResolver().query(uri,null,null,null,null);     if (cursor != null) {         cursor.moveToFirst();         // 處理數據     } } catch (Exception e){     e.printStatckTrace(); } finally {     if (cursor != null){         cursor.close();     } }   即對異常進行捕獲,並且在finally中將cursor關閉。 同樣的,在使用文件的時候,也要及時關閉。   4)使用Bitmap及時調用recycle() 前面的章節講過,在不使用Bitmap對象時,需要調用recycle()釋放內存,然後將它設置為null。雖然調用recycle()並不能保證立即釋放占用的內存,但是可以加速Bitmap的內存的釋放。 在代碼優化的過程中,如果發現某個Activity用到了Bitmap對象,卻沒有顯式的調用recycle()釋放內存,則需要分析代碼邏輯,增加相關代碼,在不再使用Bitmap以後調用recycle()釋放內存。       5)對Adapter進行優化 下面以構造ListView的BaseAdapter為例說明如何對Adapter進行優化。 在BaseAdapter類中提供了如下方法: public View getView(int position, View convertView, ViewGroup parent)   當ListView列表裡的每一項顯示時,都會調用Adapter的getView方法返回一個View, 來向ListView提供所需要的View對象。 下面是一個完整的getView()方法的代碼示例。 public View getView(int position, View convertView, ViewGroup parent) {   ViewHolder holder; if (convertView == null) {       convertView = mInflater.inflate(R.layout.list_item, null);       holder = new ViewHolder();       holder.text = (TextView) convertView.findViewById(R.id.text);       convertView.setTag(holder);   } else {       holder = (ViewHolder) convertView.getTag();   }   holder.text.setText("line" + position);   return convertView; }   private class ViewHolder {   TextView text; }   當向上滾動ListView時,getView()方法會被反復調用。getView()的第二個參數convertView是被緩存起來的List條目中的View對象。當ListView滑動的時候,getView可能會直接返回舊的convertView。這裡使用了convertView和ViewHolder,可以充分利用緩存,避免反復創建View對象和TextView對象。 如果ListView的條目只有幾個,這種技巧並不能帶來多少性能的提升。但是如果條目有幾百甚至幾千個,使用這種技巧只會創建幾個convertView和ViewHolder(取決於當前界面能夠顯示的條目數),性能的差別就非常非常大了。         6)代碼“微優化”     當今時代已經進入了“微時代”。這裡的“微優化”指的是代碼層面的細節優化,即不改動代碼整體結構,不改變程序原有的邏輯。盡管Android使用的是Dalvik虛擬機,但是傳統的Java方面的代碼優化技巧在Android開發中也都是適用的。www.2cto.com 下面簡要列舉一部分。因為一般Java開發者都能夠理解,就不再做具體的代碼說明。 創建新的對象都需要額外的內存空間,要盡量減少創建新的對象。 將類、變量、方法等等的可見性修改為最小。 針對字符串的拼接,使用StringBuffer替代String。 不要在循環當中聲明臨時變量,不要在循環中捕獲異常。 如果對於線程安全沒有要求,盡量使用線程不安全的集合對象。 使用集合對象,如果事先知道其大小,則可以在構造方法中設置初始大小。 文件讀取操作需要使用緩存類,及時關閉文件。 慎用異常,使用異常會導致性能降低。 如果程序會頻繁創建線程,則可以考慮使用線程池。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved