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

首頁 > 系統 > Android > 正文

Android編程中避免內存泄露的方法總結

2020-04-11 11:45:24
字體:
來源:轉載
供稿:網友

Android的應用被限制為最多占用16m的內存,至少在T-Mobile G1上是這樣的(當然現在已經有幾百兆的內存可以用了――譯者注)。它包括電話本身占用的和開發者可以使用的兩部分。即使你沒有占用全部內存的打算,你也應該盡量少的使用內存,以免別的應用在運行的時候關閉你的應用。Android能在內存中保持的應用越多,用戶在切換應用的時候就越快。作為我的一項工作,我仔細研究了Android應用的內存泄露問題,大多數情況下它們是由同一個錯誤引起的,那就是對一個上下文(Context)保持了長時間的引用。

在Android中,上下文(Context)被用作很多操作中,但是大部分是載入和訪問資源。這就是所有的widget都會在它們的構造函數中接受一個上下文(Context)參數。在一個合格的Android應用中,你通常能夠用到兩種上下文(Context):活動(Activity)和應用(Application)?;顒樱?a target="_blank" rel="external nofollow" >Activity)通常被傳遞給需要上下文(Context)參數的類或者方法:

復制代碼 代碼如下:

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);
 
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
 
  setContentView(label);
}

這就意味著那個View有一個對整個活動(Activity)的引用并且對這個活動(Activity)中保持的所有對象有保持了引用;通常它們包括整個View的層次和它的所有資源。因此,如果你“泄露”了上下文(Context)(這里“泄露”的意思是你保持了一個引用并且組織GC收集它),你將造成大量的內存泄露。如果你不夠小心的話,“泄露”一整個活動(Activity)是件非常簡單的事情。

當屏幕的方向改變時系統會默認的銷毀當前的活動(Activity)并且創建一個新的并且保持了它的狀態。這樣的結果就是Android會從資源中重新載入應用的UI?,F在想象一下,你寫了一個應用,有一個非常大的位圖,并且你并不想在每次旋轉時都重新載入。保留它并且每次旋轉不重新加載的最簡單的辦法就是把它保存在一個靜態字段上:

復制代碼 代碼如下:

private static Drawable sBackground;
 
@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);
 
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
 
  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);
 
  setContentView(label);
}

這段代碼非???,同時也錯的夠離譜。它泄露了當第一次屏幕角度改變時創建的第一個活動(Activity)。當一個Drawable被附加到一個View,這個View被設置為drawable的一個回調。在上面的代碼片斷中,這意味著這個Drawable對TextView有一個引用,同時這個TextView對Activity(Context對象)保持著引用,同時這個Activity對很多對象又有引用(這個多少還要看你的代碼了)。

這個例子是造成Context泄露的最簡單的一個原因,你可以看一下我們在主屏幕源碼(查看unbindDrawables()方法)中是通過在Activity銷毀時設置保存過的Drawable的回調為空來解決這個問題的。更為有趣的是,你可以創建一個context泄露的鏈,當然這非常的糟糕。它們可以讓你飛快的用光所有的內存。

有兩種簡單的方法可以避免與context相關的內存泄露。最明顯的一個就是避免在context的自身的范圍外使用它。上面的例子展示了在類內部的一個靜態的引用和它們對外部類的間接引用是非常危險的。第二個解決方案就是使用Application Context。這個context會伴隨你的應用而存在,并且不依賴Activity的的生命周期。如果你計劃保持一個需要context的長生命周期的對象,請記得考慮Application對象。你可以非常方便的通過調用Context.getApplicationContext() 或者 Activity.getApplication()獲取它。

總之,為了避免涉及到context的內存泄露,請記住如下幾點:

1.不要對一個Activity Context保持長生命周期的引用(一個對Activity的引用應該與Activity自身的生命周期相同)
2.嘗試使用應用上下文(context-application)代替活動上下文(context-activity)
3.如果你不能控制它們的生命周期,在活動(Activity)中避免使用不是靜態的內部類,使用靜態類并且使用弱引用到活動(Activity)的內部。對于這個問題的解決方法是使用靜態的內部類與一個弱引用(WeakReference)的外部類。就像ViewRoot和它的W內部類那么實現的。
4.垃圾回收器對于內存泄露來說并不是百分百保險的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黄网动漫久久久| 国产97免费视| 国产精品美女在线| 中文字幕自拍vr一区二区三区| 精品丝袜一区二区三区| 欧美大学生性色视频| 久久久中精品2020中文| 欧美性xxxx| 中文字幕免费精品一区高清| 国产经典一区二区| 国产综合视频在线观看| 992tv在线成人免费观看| 亚洲精品美女在线观看| 成人在线观看视频网站| 色yeye香蕉凹凸一区二区av| 亚洲欧美一区二区激情| 欧美成人合集magnet| 亚洲色图欧美制服丝袜另类第一页| 欧美体内谢she精2性欧美| 中文字幕在线看视频国产欧美在线看完整| 欧洲成人午夜免费大片| 亚洲国产精品电影在线观看| 精品一区精品二区| 欧美亚州一区二区三区| 久久躁日日躁aaaaxxxx| 国产精品视频资源| 亚洲国产福利在线| 欧美日韩午夜激情| 精品福利樱桃av导航| 国产成人高清激情视频在线观看| 成人av在线网址| 久久人91精品久久久久久不卡| 亚洲最大成人在线| 久久久久久久久国产| 国产伦精品免费视频| 国产日韩欧美视频在线| 日韩欧美精品在线观看| 国产精品第10页| 国产精品av网站| 欧美精品做受xxx性少妇| 国产精品久久999| 欧美精品电影在线| 2019中文在线观看| 国产精品一区二区性色av| 亚洲电影免费观看高清完整版在线| 欧美激情国产精品| 欧美一级大胆视频| 国产成人小视频在线观看| 久久久久一本一区二区青青蜜月| 欧美激情精品久久久久| 在线免费观看羞羞视频一区二区| 91免费版网站入口| 中文字幕欧美日韩va免费视频| 精品国产一区二区三区四区在线观看| 日韩av在线网站| 91在线观看免费高清完整版在线观看| 国产精品一香蕉国产线看观看| 欧美日韩中文字幕| 欧美性猛交xxxx偷拍洗澡| 欧美日韩色婷婷| 国产成人高清激情视频在线观看| 亚洲国产欧美精品| 久久99国产精品久久久久久久久| 亚洲欧洲在线看| 欧美一级片在线播放| 国产精品免费久久久| 91国产中文字幕| 久久精品国产成人精品| 久久精品免费电影| 久久精品国产96久久久香蕉| 欧美中文字幕视频在线观看| www.欧美免费| 日韩精品极品视频| 欧美精品在线免费| 久久精品2019中文字幕| 国产一区二区视频在线观看| 九九精品视频在线| 国产精品三级久久久久久电影| 热99在线视频| 久久人人爽人人| 成人在线一区二区| 亚洲毛茸茸少妇高潮呻吟| 日韩av色综合| 亚洲最大激情中文字幕| 91精品国产91久久久久久最新| 亚洲精品乱码久久久久久按摩观| 日韩精品在线免费观看| 色爱精品视频一区| 久久人体大胆视频| 亚洲影院污污.| 色综合久久久久久中文网| 久久国产精品影视| 国色天香2019中文字幕在线观看| 午夜精品久久久久久久久久久久| 在线观看国产精品日韩av| 欧美在线一区二区三区四| 国产精品直播网红| 国产精品视频在线播放| 九九久久精品一区| 国产女精品视频网站免费| 97精品国产97久久久久久| 奇米4444一区二区三区| 97超级碰碰人国产在线观看| 国产不卡av在线| 亚洲精品www久久久| 欧美国产一区二区三区| 久久久久久久久国产| 欧美洲成人男女午夜视频| 欧美成人精品h版在线观看| 亚洲激情在线观看视频免费| 91精品国产99久久久久久| 日韩电影中文 亚洲精品乱码| 98精品国产高清在线xxxx天堂| 国产精品久久久久久亚洲影视| 成人免费在线网址| 亚洲自拍偷拍色片视频| 欧美精品一本久久男人的天堂| 91手机视频在线观看| 欧美裸体xxxxx| 欧美激情精品久久久久久大尺度| 国产一区二区三区在线观看视频| 国产一区二区在线免费视频| 性亚洲最疯狂xxxx高清| 欧美成人午夜剧场免费观看| 91免费综合在线| 欧美在线性视频| 欧美夫妻性生活xx| 精品无人区乱码1区2区3区在线| 懂色aⅴ精品一区二区三区蜜月| 亚洲xxxx妇黄裸体| 在线a欧美视频| 最近免费中文字幕视频2019| 久久久久成人网| 热久久这里只有精品| 久久99青青精品免费观看| 国产精品久久久久久久久久久不卡| 久久亚洲影音av资源网| 日韩最新中文字幕电影免费看| 欧美野外猛男的大粗鳮| 欧美日本高清视频| 亚洲第一网站免费视频| 国产精品一区av| 久久69精品久久久久久国产越南| 91九色视频导航| 国产精品99免视看9| 98午夜经典影视| 成人亲热视频网站| 国产成人精品国内自产拍免费看| 永久555www成人免费| 中文国产成人精品久久一| 国产精品成人观看视频国产奇米| 欧美日韩国产丝袜美女| 欧美精品一本久久男人的天堂| 日韩av在线一区二区| 国产一区二区三区日韩欧美| 91国产精品91| 国产精品福利网| 久久九九精品99国产精品| 亚洲欧洲在线播放| 久久成人精品一区二区三区| zzijzzij亚洲日本成熟少妇| 欧美成人免费全部| 夜夜嗨av一区二区三区免费区| 久久亚洲精品中文字幕冲田杏梨|