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

來源:互聯網
上載者:User

通常我們寫程式,都是在專案計劃的壓力下完成的,此時完成的代碼可以完成具體商務邏輯,但是效能不一定是最佳化的。一般來說,優秀的程式員在寫完代碼之後都會不斷的對代碼進行重構。重構的好處有很多,其中一點,就是對代碼進行最佳化,提高軟體的效能。下面我們就從幾個方面來瞭解Android開發過程中的代碼最佳化。 1)靜態變數引起記憶體泄露在代碼最佳化的過程中,我們需要對代碼中的靜態變數特別留意。靜態變數是類相關的變數,它的生命週期是從這個類被聲明,到這個類徹底被記憶體回收行程回收才會被銷毀。所以,一般情況下,靜態變數從所在的類被使用開始就要一直佔用著記憶體空間,直到程式退出。如果不注意,靜態變數引用了佔用大量記憶體的資源,造成記憶體回收行程無法對記憶體進行回收,就可能造成記憶體的浪費。先來看一段代碼,這段代碼定義了一個Activity。private static Resources mResources; @Overrideprotected 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; @Overrideprotected 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。不要在迴圈當中聲明臨時變數,不要在迴圈中捕獲異常。如果對於安全執行緒沒有要求,盡量使用線程不安全的集合對象。使用集合對象,如果事Crowdsourced Security Testing道其大小,則可以在構造方法中設定初始大小。檔案讀取操作需要使用緩衝類,及時關閉檔案。慎用異常,使用異常會導致效能降低。如果程式會頻繁建立線程,則可以考慮使用線程池。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.