日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android不要做錯來使內(nèi)存泄漏

Android中context可以作很多操作,但是最主要的功能是加載和訪問資源。在android中有兩種context,一種是 application context,一種是activity context,通常我們在各種類和方法間傳遞的是activity context,比如一個activity的onCreate。

福清網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

Java 代碼:

 
 
 
  1. protected void onCreate(Bundle state) {   
  2. super.onCreate(state);   
  3. TextView label = new TextView(this); //傳遞context給view control   
  4. label.setText("Leaks are bad");   
  5. setContentView(label);   

把a(bǔ)ctivity context傳遞給view,意味著view擁有一個指向activity的引用,進(jìn)而引用activity占有的資源:view hierachy, resource等。

這樣如果context發(fā)生內(nèi)存 泄露的話,就會泄露很多內(nèi)存。

這里泄露的意思是gc沒有辦法回收activity的內(nèi)存。

Leaking an entire activity是很容易的一件事。

當(dāng)屏幕 旋轉(zhuǎn)的時候,系統(tǒng) 會銷毀當(dāng)前的activity,保存狀態(tài) 信息,再創(chuàng)建一個新的。

比如我們寫了一個應(yīng)用 程序 ,它需要加載一個很大的圖片,我們不希望每次旋轉(zhuǎn)屏 幕的時候都銷毀這個圖片,重新加載。實(shí)現(xiàn)這個要求的簡單想法就是定義 一個靜態(tài)的Drawable,這樣Activity 類創(chuàng)建銷毀它始終保存在內(nèi)存中。

實(shí)現(xiàn)類似:

java代碼:

 
 
 
  1. public class myactivity extends Activity {   
  2. private static Drawable sBackground;   
  3. protected void onCreate(Bundle state) {   
  4. super.onCreate(state);   
  5. TextView label = new TextView(this);   
  6. label.setText("Leaks are bad");   
  7. if (sBackground == null) {   
  8. sBackground = getDrawable(R.drawable.large_bitmap);   
  9. }   
  10. label.setBackgroundDrawable(sBackground);//drawable attached to a view   
  11. setContentView(label);   
  12. }   
  13. }  

這段程序看起來很簡單,但是卻問題很大。當(dāng)屏幕旋轉(zhuǎn)的時候會有l(wèi)eak(即gc沒法銷毀activity)。我們剛才說過,屏幕旋轉(zhuǎn)的時候系統(tǒng)會銷毀當(dāng)前的activity。但是當(dāng)drawable和view關(guān)聯(lián)后,drawable保存了view的reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能銷毀,它所 引用和間接引用的都不能銷毀,這樣系統(tǒng)就沒有辦法銷毀當(dāng)前的activity,于是造成了內(nèi)存泄露。gc對這種類型的內(nèi)存泄露是無能為力的。

避免這種內(nèi)存泄露的方法是避免activity中的任何對象 的 生命周期長過activity,避免由于對象對 activity的引用導(dǎo)致activity不能正常被銷毀。我們可以使用application context。application context伴隨application的一生,與activity的生命周期無關(guān)。application context可以通過Context.getApplicationContext或者Activity.getApplication方法獲取 。

避免context相關(guān)的內(nèi)存泄露,記住以下幾點(diǎn):

1. 不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的。

2. 對于生命周期長的對象,可以使用application context。

3. 避免非靜態(tài)的內(nèi)部類,盡量使用靜態(tài)類,避免生命周期問題,注意內(nèi)部類對外部對象引用導(dǎo)致的生命周期變化。


新聞標(biāo)題:Android不要做錯來使內(nèi)存泄漏
分享URL:http://www.5511xx.com/article/djhpgps.html