Android避免記憶體泄露:合理使用getContext()和getApplication()

來源:互聯網
上載者:User
Android應用程式限制使用的堆記憶體是16M(註:堆記憶體與裝置的效能也有一定關係,效能高的裝置可用堆記憶體可能是24M或者更高),其中電話功能會佔用一部分,而開發人員能夠使用的則非常有限。如果你不打算用完所有記憶體,那麼你的應用就應該儘可能少用記憶體,從而使其他的程式在運行時不致於被殺掉。Android系統在記憶體中能夠持有的應用程式越多,使用者在程式間進行切換時就越快。作為工作的一部分,我研究Android應用中的記憶體泄露問題,結果發現多數情況是同一個問題引起的:對Context持有一個過長的引用。

     在Android中,Context被用在許多操作中,但多數是為了載入或訪問資源。這就是為什麼所有的Widget組件都會在構造器中接收一個Context參數的原因所在。對於一般的Android應用,通常有兩種Context,即Activity和Application。開發人員通常需要context在類或方法間傳遞時會選擇Activity。


    這表明Views對整個Activity有一個引用,因此你的Activity中任何東西都會被(Views)持有,一般被持有的是視圖層級和它對應的資源。因此,如果你泄露了Context(泄露:即你持有一個Context引用,結果阻止GC對其進行回收),你就泄露了一些記憶體。如果你不細心,泄露一個Activity就會變得非常容易。

    當螢幕方向改變,系統預設會儲存它的狀態,銷毀當前Activity並重新建立一個。為了做到這一點,Android會從資源中重新載入應用程式的UI。現在假設你開發一個應用,包含了大量位元影像(Bitmap),你不想每次螢幕切換時都去載入位元影像。那麼最簡單的方法是利用static靜態域。


    上面的代碼非常簡潔,但也容易出錯:第一次螢幕方向改變時,最初建立的Activity(每次螢幕改變都會重新建立Activity)就會出現記憶體流失。當一個Drawable對象被附著到View中,View就會在這個Drawable上被設定作為回調callback。上面的程式碼片段表明drawable對TextView有一個引用,而TextView本身又對Activity(即Context)持有引用,反過來,Activity又對許多東西持有引用(這取決於你的代碼)。

    上面的例子是泄露Context最簡單的一種情況,你能在Home
screen的原始碼(尋找unbindDrawables()方法)中看到我們是怎麼解決它的:當Activity被銷毀時,設定被儲存的drawable的回調為null。有趣的是,你建立一系列記憶體泄露的Context會出現許多情況,並且它們都是糟糕的。它們很快使你在運行過程時出現記憶體溢出。

    有兩種簡單的方式去避免Context相關的記憶體泄露。最明顯的一種就是避免Context超出它的範圍。上面的例子展現了靜態引用的情況:內部類以及對外部類的間接引用是很危險的。第二種方案是用Application。這種Context不依賴於Activity的生命週期,而是與你的應用程式同生共死。如果你打算持有一個長期活動並且需要Context引用的對象,記得使用Application對象。你可以通過調用Context.getApplicationContext() 或者 Activity.getApplication()方法得到它。

總的來說,要避免Context相關的記憶體泄露,銘記以下幾條:

•不要對Activity(Activity繼承自Context)作長期的引用(一個指向Activity的引用與Activity本身有相同的生命週期);

•試著用Application代替Activity;

•如果你不能控制內部類的生命週期,避免使用非靜態內部類,應該用靜態內部類,並且對裡面的Activity作弱引用。該問題的解決方案是:對於外部類,用WeakReference構造靜態內部類,同時要在視圖根完成,並且它的WeakReference內部類要有一個執行個體(WeakReference)。

•記憶體回收不是防止記憶體泄露的保險方式.

轉自:http://blog.csdn.net/snow4dev/article/details/7555130

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.