亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

解析Android開發優化之:從代碼角度進行優化的技巧

2020-04-11 12:25:55
字體:
來源:轉載
供稿:網友

通常我們寫程序,都是在項目計劃的壓力下完成的,此時完成的代碼可以完成具體業務邏輯,但是性能不一定是最優化的。一般來說,優秀的程序員在寫完代碼之后都會不斷的對代碼進行重構。重構的好處有很多,其中一點,就是對代碼進行優化,提高軟件的性能。下面我們就從幾個方面來了解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中的所有對象都不能被回收。這個時候,一部分內存就浪費掉了。

經驗分享:

在實際項目中,我們經常會把一些對象的引用加入到集合中,如果這個集合是靜態的話,就需要特別注意了。當不需要某對象時,務必及時把它的引用從集合中清理掉?;蛘呖梢詾榧咸峁┮环N更新策略,及時更新整個集合,這樣可以保證集合的大小不超過某值,避免內存空間的浪費。
 

2)使用Application的Context

在Android中,Application Context的生命周期和應用的生命周期一樣長,而不是取決于某個Activity的生命周期。如果想保持一個長期生命的對象,并且這個對象需要一個Context,就可以使用Application對象??梢酝ㄟ^調用Context.getApplicationContext()方法或者Activity.getApplication()方法來獲得Application對象。

依然拿上面的代碼作為例子??梢詫⒋a修改成下面的樣子。

復制代碼 代碼如下:

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開發中也都是適用的。

下面簡要列舉一部分。因為一般Java開發者都能夠理解,就不再做具體的代碼說明。

創建新的對象都需要額外的內存空間,要盡量減少創建新的對象。

將類、變量、方法等等的可見性修改為最小。

針對字符串的拼接,使用StringBuffer替代String。

不要在循環當中聲明臨時變量,不要在循環中捕獲異常。

如果對于線程安全沒有要求,盡量使用線程不安全的集合對象。

使用集合對象,如果事先知道其大小,則可以在構造方法中設置初始大小。

文件讀取操作需要使用緩存類,及時關閉文件。

慎用異常,使用異常會導致性能降低。

如果程序會頻繁創建線程,則可以考慮使用線程池。

經驗分享:

代碼的微優化有很多很多東西可以講,小到一個變量的聲明,大到一段算法。尤其在代碼Review的過程中,可能會反復審查代碼是否可以優化。不過我認為,代碼的微優化是非常耗費時間的,沒有必要從頭到尾將所有代碼都優化一遍。開發者應該根據具體的業務邏輯去專門針對某部分代碼做優化。比如應用中可能有一些方法會被反復調用,那么這部分代碼就值得專門做優化。其它的代碼,需要開發者在寫代碼過程中去注意。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
538国产精品一区二区在线| 91亚洲国产成人久久精品网站| 国产91色在线免费| 成人在线免费观看视视频| 日韩在线观看免费全集电视剧网站| 91夜夜未满十八勿入爽爽影院| 中文字幕亚洲综合久久筱田步美| 亚洲精品在线不卡| 亚洲图片在区色| 青青草原成人在线视频| 一本大道香蕉久在线播放29| 亚洲a在线播放| 亚洲国产中文字幕在线观看| 国产精品一区电影| 欧美日韩成人在线观看| 国产精品视频26uuu| 亚洲第一男人天堂| 91九色在线视频| 国产亚洲精品久久久久动| 亚洲天堂开心观看| 日韩欧美成人精品| 欧美成人剧情片在线观看| 日韩国产精品视频| 91美女高潮出水| 88国产精品欧美一区二区三区| 2019av中文字幕| 成人午夜两性视频| 欧美日韩人人澡狠狠躁视频| 久久综合免费视频影院| 欧美黑人狂野猛交老妇| 欧美激情久久久久久| 久久精品国产久精国产思思| 精品亚洲一区二区三区四区五区| 精品女同一区二区三区在线播放| 日韩一区视频在线| 91精品久久久久久久久久入口| 色婷婷av一区二区三区久久| 亚洲天堂av高清| 成人有码在线视频| 91老司机精品视频| 日韩电影在线观看永久视频免费网站| 日产精品久久久一区二区福利| 97在线免费观看视频| 欧美在线视频导航| 精品国产乱码久久久久久婷婷| 日韩欧美国产激情| 永久免费精品影视网站| 欧美激情综合色综合啪啪五月| 欧美激情一区二区三级高清视频| 九色精品免费永久在线| 久久久精品2019中文字幕神马| 日韩性xxxx爱| 久久久噜噜噜久噜久久| 亚洲一品av免费观看| 国产精品视频99| 欧美精品精品精品精品免费| 日韩精品视频免费| 日韩欧美在线免费观看| 91久久久久久久久久久| 精品免费在线视频| 色偷偷av一区二区三区| 亚洲激情久久久| 久久久久久久一区二区| 按摩亚洲人久久| 国产精品678| 久久国产精品网站| 欧美性理论片在线观看片免费| 日韩av影院在线观看| 国产丝袜一区视频在线观看| 日韩在线中文字幕| 色综合久久中文字幕综合网小说| 国产成人精品免费视频| 最近的2019中文字幕免费一页| 亚洲精品午夜精品| 国产一区二区三区在线观看网站| 欧美激情一区二区三级高清视频| 国产一区二区黄| 大量国产精品视频| 国产精品一区二区电影| 日韩**中文字幕毛片| 欧美有码在线视频| 精品夜色国产国偷在线| 九九精品在线播放| 国产成人91久久精品| 久久精品国产综合| 红桃视频成人在线观看| 92福利视频午夜1000合集在线观看| 日韩一区av在线| 久久精品成人一区二区三区| 精品国产一区二区三区久久| 亚洲奶大毛多的老太婆| 亚洲国产高潮在线观看| 日韩精品在线观| 国产精品久久77777| 久久成年人免费电影| 欧美大片免费观看| 国产成人精品视| 成人久久久久爱| 97在线看福利| 欧美自拍大量在线观看| 精品少妇一区二区30p| 亚洲精品少妇网址| 91视频国产高清| 亚洲人成电影网站色| 成人性教育视频在线观看| 日本伊人精品一区二区三区介绍| 亚洲国产成人精品久久| 日韩在线中文字| 欧美一级淫片videoshd| 欧美精品精品精品精品免费| 日韩电影中文字幕av| 国产精品三级在线| 亚洲欧美福利视频| 久久久久久久一区二区| 伊人久久男人天堂| 久久久久国产精品一区| 91九色视频在线| 欧美精品videosex牲欧美| 91久久国产综合久久91精品网站| 亚洲天堂精品在线| 日本亚洲精品在线观看| 亚洲综合中文字幕在线| 蜜臀久久99精品久久久无需会员| 美女撒尿一区二区三区| 国产91精品黑色丝袜高跟鞋| 亚洲精品久久久久久久久久久久| 国产成人短视频| 国产精品久久久久久久久久久新郎| 欧美影院在线播放| 51ⅴ精品国产91久久久久久| 国产精品国内视频| 国产精品一区二区三区成人| 亚洲国产精品电影| 在线观看91久久久久久| 日韩av电影院| 亚洲成人激情小说| 国产a∨精品一区二区三区不卡| 亚洲欧美日韩国产成人| 日韩精品小视频| 亚洲欧洲av一区二区| 日韩av色在线| 69国产精品成人在线播放| 国内外成人免费激情在线视频| 亚洲综合大片69999| 成人黄色生活片| 亚洲国产99精品国自产| 成人久久一区二区三区| 欧美午夜精品伦理| 国产精品久久久久久亚洲调教| 亚洲另类图片色| 欧美激情一级二级| 亚洲国产成人在线视频| 日韩经典一区二区三区| 少妇高潮久久久久久潘金莲| 亚洲成人久久久久| 日韩av免费在线播放| 日韩亚洲欧美成人| 日韩精品在线免费播放| 在线亚洲国产精品网| 欧美成aaa人片在线观看蜜臀| 久久精品视频亚洲| 91香蕉嫩草影院入口| 日韩在线免费视频| 亚洲欧洲xxxx|