<翻譯>避免內(nèi)存泄漏

翻譯自:http://android-developers.blogspot.sg/2009/01/avoiding-memory-leaks.html
Android中堆的內(nèi)存是有限的贮缅,你應當使用盡量小的內(nèi)存介却。因為Android能在內(nèi)存中保存越多的應用,對于用戶來說桂肌,切換應用就會十分的迅速胃夏。相當多的內(nèi)存泄漏的原因是因為:保持了一個對context的長引用(long-lived)。
在Android中仰禀,Context可以用來做許多事情答恶,不過大部分是用來加載和獲取資源萍诱。這就是為什么所有的視圖組件在構造方法里面需要context作為參數(shù)的原因。有兩種Context裕坊,Activity和Application,通常使用第一個周瞎。比如:

    TextView label =new TextView(this);

這代表著views持有一個對于activity的引用饵蒂。所以,如果你泄漏了Context(你保留了一個對它的引用退盯,在GC的時候保護了它)。如果你不夠小心的話慰照,泄漏掉整個Activity是很容易的琉朽。
當屏幕的顯示方向發(fā)生變化時,系統(tǒng)將會(默認)銷毀現(xiàn)在的Activity漓骚,維護它的一些數(shù)據(jù)然后新建一個Activity榛泛。如果這樣做的話曹锨,Android 將會重新讀取UI剃允。想象一下,你在你的應用里面使用了一個大bitmap斥废,你不想每次旋轉的時候都重新加載它。最簡單的方法就是把它放在一個靜態(tài)域里面捧灰。

    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.shoothzj);
        }
        label.setBackgroundDrawable(sBackground);
        setContentView(label);
    }    

上述代碼很快但是是錯誤的统锤,它泄漏了在第一次屏幕旋轉之前的Activity。當一個Drawable連系在view上時煌寇,view就像被設置為drawable的回調一樣逾雄。對于上面的代碼,就是說drawable持有了對于textview的引用鸦泳,而textview又持有了activity的引用。這就把Activity泄漏掉了徒仓。當Activity被銷毀的時候,把drawable的回調設置為null掉弛。
有兩種簡單的方式去避免內(nèi)存泄漏喂走。第一個就是避免context超范圍的使用。例子上展示的是靜態(tài)引用但是內(nèi)部類以及他們持有的對外部類的明確引用也同樣危險乎芳。第二個解決方法,利用Application context奈惑,這個context的存活時間跟你的應用一樣久。如果打算保持一個長久的對象寂殉,就用 Context.getApplicationContext() 或者 Activity.getApplication()原在。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市村怪,隨后出現(xiàn)的幾起案子浮庐,更是在濱河造成了極大的恐慌,老刑警劉巖审残,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件维苔,死亡現(xiàn)場離奇詭異懂昂,居然都是意外死亡,警方通過查閱死者的電腦和手機沸柔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門铲敛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人工三,你說我怎么就攤上這事〖笳” “怎么了焙畔?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長儿惫。 經(jīng)常有香客問我,道長留搔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任催式,我火速辦了婚禮避归,結果婚禮上,老公的妹妹穿的比我還像新娘哺窄。我一直安慰自己萌业,他們只是感情好生年,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布廓奕。 她就那樣靜靜地躺著,像睡著了一般蒸绩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上患亿,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天步藕,我揣著相機與錄音,去河邊找鬼漱抓。 笑死,一個胖子當著我的面吹牛乞娄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仪或,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蕾域!你這毒婦竟也來了?” 一聲冷哼從身側響起旨巷,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤采呐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斧吐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡煤率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年蝶糯,在試婚紗的時候發(fā)現(xiàn)自己被綠了辆沦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舷礼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妻献,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布谨履,位于F島的核電站熬丧,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜害捕,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一尝盼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盾沫,春花似錦、人聲如沸赴精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掀潮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仪吧,已是汗流浹背鞠眉。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留械蹋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓郊艘,卻偏偏與公主長得像唯咬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胆胰,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容