一般,寫程序都是在必定的項目壓力下完成的,因此每每只注重完成具體的業務邏輯,性能每每不是最優的。此時,優秀的程序員在寫完代碼以後都會對代碼進行重構。 php
靜態變量的生命週期:從類被聲明,到該類對象完全被GC回收。在這期間它會一直佔用內存空間,若是靜態變量引用了佔用大量內存的資源,則容易形成OOM html
private static Resources mResources; protected void onCreate(Bundle state) { super.onCreate(state); if(mResources == null) { mResources = this.getResources(); } }下圖能夠解釋使用靜態變量容易出現的問題:
在實際項目中,常常會把一些對象的引用加入到集合中,若是這個集合是靜態的話,就須要特別注意了。當不須要某對象時,務必及時把它的引用從集合中清理掉。或者能夠爲該集合提供一種更新策略,及時更新整個集合。 java
Context生命週期:與應用程序的生命週期同樣長,而不是取決於某個Activity的生命週期。 程序員
若是想保持一個長期生命的對象,而且該對象須要一個Context,就可使用Application對象了。因此,上面代碼能夠改成: 緩存
mResources = this.getApplication().getResources(); 或者 mResources = Context.getApplication().getResources();這裏代碼修改後,Resources對象擁有的是Application對象的引用。若是Activity被從新建立,第一次建立的Activity就能夠被回收了。
Cursor是Android查詢數據後獲得的一個管理數據集合的類。通常操做完畢後,需及時的關閉它。下面就是關於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關閉。
下面以構造ListView的BaseAdapter爲例說明如何對Adapter進行優化。 優化
當ListView列表裏的每一項顯示時,都會調用Adapter的getView方法返回一個View,以向ListView提供所須要的View對象。下面的代碼是通用的優化程度較高的代碼: this
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對象。 spa
若是ListView的條目只有幾個,這種技巧並不能帶來多少性能的提高。可是若是條目有幾百甚至幾千個,使用這種技巧只會建立幾個convertView和ViewHolder(取決於當前界面可以顯示的條目數),性能的差異就很是很是大了。 線程
要理解得更加透徹點能夠看下這篇文章:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6985.html
5. 代碼微優化
一般都是Java中代碼的優化,但一樣適用於Android,常見的優化有如下這些:
減小對象的建立,好比考慮單例模式;
將類、變量、方法的可見性修改成最小;
針對字符串的拼接,使用StringBuffer代替String;
不要再循環中聲明臨時變量,不要再循環中捕獲異常;
使用集合對象時,若是事先知道其大小,則能夠在構造方法中設置初始大小;
文件讀取操做須要使用緩存類,及時關閉文件;
慎用異常,使用異常會致使性能下降;
若是程序頻繁的建立線程,則能夠考慮使用線程池。
這些優化都是程序構建過程當中很是廣泛的優化,因此儘可能在剛開始寫代碼的時候就注意到。而後後期再根據具體的業務邏輯去專門針對某部分代碼進行優化。