日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > 綜合技術(shù) > 避免長(zhǎng)期持有了一個(gè)Context的引用造成內(nèi)存泄露

避免長(zhǎng)期持有了一個(gè)Context的引用造成內(nèi)存泄露

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-05-14 09:12:21 閱讀次數(shù):4702次

    Android上 ,Context可以用于很多操作,但是大部份時(shí)候是用來(lái)加載和使用資源。這就是為何所有的widgets在他們的構(gòu)造函數(shù)中接受1個(gè)Context參數(shù)。在1般的android利用中,你通常有兩種Context:分別是Activity和Application。通常的,當(dāng)我們的類(lèi)和方法需要使用到context時(shí),我們傳遞的是Activity這個(gè)context。

   

[java]
  1. @Override  
  2. protected void onCreate(Bundle state) {  
  3.   super.onCreate(state);  
  4.     
  5.   TextView label = new TextView(this);  
  6.   label.setText("Leaks are bad");  
  7.     
  8.   setContentView(label);  
  9. }  

    這意味著views具有1個(gè)對(duì)全部activity的援用,也就是援用了你的activity所具有的1切;通常的,這指的是完全的視圖層級(jí)結(jié)構(gòu)和所有它的資源。因此,如果你泄漏了1個(gè)Context(“ 泄漏 ”意味著你保持著它的1個(gè)援用,從而使它不能被垃圾回收機(jī)制回收),就意味著你泄漏了很多的內(nèi)存。如果你不謹(jǐn)慎, 泄漏1 個(gè)activity的所有資源真的非常容易。
    當(dāng) 屏幕的方向產(chǎn)生改變的時(shí)候,系統(tǒng)默許將會(huì)燒毀當(dāng)前的activity并且創(chuàng)建1個(gè)新的activity同時(shí)保持著原本的狀態(tài)。在做這個(gè)的時(shí)候,Android會(huì)從資源重新加載利用的UI。現(xiàn)在,想象1下你寫(xiě)了1個(gè)利用,這個(gè)利用有1張很大的bitmap。你不想再每次旋轉(zhuǎn)的時(shí)候重新加載它。最簡(jiǎn)單的方法讓bitmap延續(xù)作用而不隨每個(gè)方向而重新加載 ,就是把它放進(jìn)1個(gè)靜態(tài)域:

[java]
  1. private static Drawable sBackground;  
  2.     
  3. @Override  
  4. protected void onCreate(Bundle state) {  
  5.   super.onCreate(state);  
  6.     
  7.   TextView label = new TextView(this);  
  8.   label.setText("Leaks are bad");  
  9.     
  10.   if (sBackground == null) {  
  11.     sBackground = getDrawable(R.drawable.large_bitmap);  
  12.   }  
  13.   label.setBackgroundDrawable(sBackground);  
  14.     
  15.   setContentView(label);  
  16. }  
    這段代碼很快,但是毛病也很?chē)?yán)重:它泄漏了第1個(gè)activity,這個(gè)在第1次屏幕改變時(shí)被創(chuàng)建的activity。當(dāng)1個(gè)Drawable被關(guān)聯(lián)到1個(gè)view上,這個(gè)view就相當(dāng)于在drawable上設(shè)置的1個(gè)回調(diào)。在上面的代碼片斷中,這表示drawable有1個(gè)TextView的援用,而這個(gè)TextView又具有1個(gè)activity的援用(Context),activity順次援用了幾近所有的東西(取決于你的代碼)。

這個(gè)例子展現(xiàn)了1個(gè)最簡(jiǎn)單的Context 泄漏的情況,你可以在Home screen 的源碼中看到我們是如何解決這個(gè)問(wèn)題的( 查找unbindDrawables() 方法) ,這就是當(dāng)activity 被燒毀的時(shí)候?qū)rawables 的回調(diào)設(shè)為null 。有趣的是,你可能創(chuàng)造出1系列context泄漏的情況有很多,這非常糟。他們會(huì)是你很快內(nèi)存溢出。
     有兩種簡(jiǎn)單的方法來(lái)避免context 相干的內(nèi)存泄漏。最顯著地1個(gè)是避免context 逃出他自己的范圍以外。上面的例子就展現(xiàn)了使用靜態(tài)援用的情況,而內(nèi)部類(lèi)和他們對(duì)外部類(lèi)的的隱式援用也是一樣危險(xiǎn)的。第2種方法是使用Application context 。這個(gè)context 的生存周期和你的利用的生存周期1樣長(zhǎng),而不是取決于activity 的生存周期。如果你想保持1個(gè)長(zhǎng)時(shí)間生存的對(duì)象,并且這個(gè)對(duì)象需要1個(gè)context ,記得使用application 對(duì)象。你可以通過(guò)調(diào)用Context.getApplicationContext() or Activity.getApplication() 來(lái)取得。
      總而言之,想要避免context 相干的內(nèi)存泄漏 ,記住以下幾點(diǎn):
          1、不要對(duì)activity 的context 長(zhǎng)時(shí)間援用( 1個(gè)activity 的援用的生存周期應(yīng)當(dāng)和activity 的生命周期相同)
          2、試著使用關(guān)于application的 context 來(lái)替換和activity相干的context
          3、如果1個(gè)acitivity 的非靜態(tài)內(nèi)部類(lèi)的生命周期不受控制,那末避免使用它;使用1個(gè)靜態(tài)的內(nèi)部類(lèi)并且對(duì)                  其中的activity 使用1個(gè)弱援用。解決這個(gè)問(wèn)題的方法是使用1個(gè)靜態(tài)的內(nèi)部類(lèi),并且對(duì)它的外部類(lèi)有1                   WeakReference,就像在ViewRoot中內(nèi)部類(lèi)W所做的就是這么個(gè)例子。
         4、垃圾回收器不能處理內(nèi)存泄
的保障

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 福利视频一区二区三区 | 国产激情在线 | 国产99久久 | 国产精品久久久久久久久久久久久 | 国产精品久久久久久一区二区三区 | 高清不卡一区二区三区 | 在线观看一区 | 亚洲在线电影 | 日韩av在线免费播放 | 午夜av一区 | 在线日韩一区二区 | 日韩偷拍一区二区 | 国产视频99 | 成年人免费看 | 51ⅴ精品国产91久久久久久 | 国产精品福利一区 | 久久精品亚洲 | 欧美91| 91嫩草在线 | 国产精品一区二区视频 | 亚洲三级免费 | 欧美日在线 | 国产成人在线看 | 久久精品国产欧美亚洲人人爽 | 国产搞黄色 | 久久国产精品电影 | 久一在线| 色肉色伦交av色肉色伦 | 中文字幕日本在线观看 | a区毛片| 91精品久久久久久 | 韩国三级av| 黄色毛片免费视频 | 成年人免费在线观看 | 国产综合亚洲精品一区二 | 爱情岛论坛亚洲线路一 | www久久国产 | 亚洲视频免费观看 | 亚洲精品电影网在线观看 | 午夜精品久久久久久久久久久久 | 91免费福利|