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

首頁 > 系統 > Android > 正文

android基礎教程之context使用詳解

2020-04-11 11:53:17
字體:
來源:轉載
供稿:網友

在android中有兩種context,一種是application context,一種是activity context,通常我們在各種類和方法間傳遞的是activity context。

區別聯系:

復制代碼 代碼如下:

public class MyActivity extends Activity {
    public void method() {
       mContext = this;    // since Activity extends Context
       mContext = getApplicationContext();
       mContext = getBaseContext();
    }
 }

this 是Activity 的實例,擴展了Context,其生命周期是Activity 創建到銷毀
getApplicationContext() 返回應用的上下文,生命周期是整個應用,應用摧毀它才摧毀
Activity.this的context 返回當前activity的上下文,屬于activity ,activity 摧毀他就摧毀
getBaseContext() 返回由構造函數指定或setBaseContext()設置的上下文,SDK文檔很少,不推薦使用
搞清楚了生命周期就會在使用過程中犯錯誤,比如有一個全局的數據操作類用到了context,這個時候就要用到getApplicationContext 而不是用ACtivity,這就保證了數據庫的操作與activity無關(不會一直引用Activity的資源,防止內存泄漏)

應用場景:
比如一個activity的onCreate:

復制代碼 代碼如下:

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

把activity context傳遞給view,意味著view擁有一個指向activity的引用,進而引用activity占有的資源:view hierachy, resource等。
這樣如果context發生內存泄露的話,就會泄露很多內存。這里泄露的意思是gc沒有辦法回收activity的內存。

Leaking an entire activity是很容易的一件事。當屏幕旋轉的時候,系統會銷毀當前的activity,保存狀態信息,再創建一個新的activity。
比如我們寫了一個應用程序,它需要加載一個很大的圖片,我們不希望每次旋轉屏幕的時候都銷毀這個圖片重新加載。
實現這個要求的簡單想法就是定義一個靜態的Drawable,這樣Activity 類創建銷毀它始終保存在內存中。
實現示例:

復制代碼 代碼如下:

public class myactivity extends Activity {       
       private static Drawable sBackground;       
       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);//drawable attached to a view       
              setContentView(label);       
       }
}

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

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

避免context相關的內存泄露,記住以下幾點:
1. 不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的
2. 對于生命周期長的對象,可以使用application context
3. 避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類對外部對象引用導致的生命周期變化

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情手机在线视频| 久久久免费av| 午夜精品福利视频| 中文字幕欧美精品日韩中文字幕| 欧美性xxxx极品hd欧美风情| 日韩免费视频在线观看| 国产精品免费观看在线| 日韩免费在线免费观看| 精品亚洲一区二区三区在线观看| 久久成人人人人精品欧| 国产亚洲激情在线| 69视频在线免费观看| 欧美精品情趣视频| 国产香蕉精品视频一区二区三区| 精品亚洲男同gayvideo网站| 午夜精品蜜臀一区二区三区免费| 国产91精品久久久久久久| 欧美激情国产高清| 国产精品99久久久久久久久| 久久久久久国产精品久久| 大量国产精品视频| 青青在线视频一区二区三区| 91久久久久久国产精品| 国产精品美女在线| 欧美国产日韩一区二区在线观看| 国产精品吹潮在线观看| 69**夜色精品国产69乱| 精品动漫一区二区| 欧美性精品220| 中文字幕少妇一区二区三区| 国产精品入口夜色视频大尺度| 欧美成人免费va影院高清| 在线播放日韩精品| 国产免费一区二区三区在线观看| 一区二区欧美在线| 日韩电影中文字幕在线| 丰满岳妇乱一区二区三区| 精品日本高清在线播放| 欧美一区三区三区高中清蜜桃| 国产精品盗摄久久久| 亚洲男人的天堂在线播放| 亚洲福利在线播放| 欧美黄网免费在线观看| 久久亚洲精品成人| 最近日韩中文字幕中文| 精品国产欧美一区二区三区成人| 亚洲国产一区自拍| 国产精品色午夜在线观看| 色中色综合影院手机版在线观看| 久久久久久亚洲精品不卡| 国产午夜精品视频免费不卡69堂| 成人亚洲综合色就1024| 亚洲女人天堂成人av在线| 日本韩国欧美精品大片卡二| 久久影院模特热| 91高清免费在线观看| 国产日韩精品一区二区| 久久久久久午夜| 成人妇女免费播放久久久| 国产精品pans私拍| 久久免费高清视频| 成人福利在线观看| 欧美成年人视频网站欧美| 奇米4444一区二区三区| 国产性猛交xxxx免费看久久| 日本免费久久高清视频| 国产成人av网址| 日韩精品免费综合视频在线播放| 久久免费在线观看| 欧美日韩精品在线视频| 亚洲视频欧美视频| 91精品久久久久久久久久另类| 日本一欧美一欧美一亚洲视频| 亚洲国产精彩中文乱码av在线播放| 欧美性极品xxxx娇小| 欧美极品在线视频| 日韩免费在线看| 日韩精品在线免费播放| 欧美最近摘花xxxx摘花| 欧美中文在线观看国产| 亚洲影院污污.| 亚洲bt欧美bt日本bt| 中文字幕久热精品视频在线| 久久久久久久色| 亚洲欧美激情精品一区二区| 成人av番号网| 欧美视频在线观看免费| 日韩av网址在线| 精品久久久久久久久久| 国产精品视频在线观看| 69av在线视频| 国产精品久久久久久久久久三级| 国产精品v片在线观看不卡| 日韩在线观看高清| 亚洲精品小视频在线观看| 亚洲成人黄色网址| 亚洲欧美成人一区二区在线电影| 国产精自产拍久久久久久| 国产成人avxxxxx在线看| 91精品在线观看视频| 按摩亚洲人久久| 黄色一区二区在线观看| 亚洲少妇中文在线| 亚洲成年网站在线观看| 国产日韩欧美视频在线| 日韩精品一区二区视频| 精品中文字幕在线观看| 精品久久久久久久久久久久久久| 欧美肥老太性生活视频| 欧美亚洲另类在线| 日韩欧美视频一区二区三区| 欧美性在线观看| 国产欧美一区二区三区久久人妖| 日韩成人性视频| 国产欧美久久一区二区| 亚洲色图欧美制服丝袜另类第一页| 17婷婷久久www| 91亚洲人电影| 久久久精品国产| 日本道色综合久久影院| 亚洲人成在线电影| 国产精品999| 欧美极品美女视频网站在线观看免费| 欧美视频免费在线| 日韩欧美成人网| 综合国产在线视频| 国产一区二区丝袜| 久久精彩免费视频| 一区二区国产精品视频| 亚洲欧美日韩中文在线| 欧美成年人在线观看| 岛国av一区二区在线在线观看| 色偷偷偷综合中文字幕;dd| 久久久久亚洲精品成人网小说| 国产精品欧美一区二区三区奶水| 国产精品天天狠天天看| 国产精品日韩在线| 少妇高潮 亚洲精品| 91亚洲精品久久久久久久久久久久| 欧美高清在线观看| 啪一啪鲁一鲁2019在线视频| 国产欧美日韩丝袜精品一区| 成人xvideos免费视频| 久久久久久国产免费| 精品无码久久久久久国产| 欧美日本高清视频| 国产精品91久久久久久| 国产91精品黑色丝袜高跟鞋| 久久精彩免费视频| 91av网站在线播放| 国产精品小说在线| 亚洲自拍偷拍在线| 日本亚洲精品在线观看| 久久6免费高清热精品| 亚洲va久久久噜噜噜| 国产精品一久久香蕉国产线看观看| 久久99亚洲热视| 欧美午夜片在线免费观看| 亚洲石原莉奈一区二区在线观看| 欧美成人免费在线视频| 在线播放国产一区二区三区| 亚洲高清一区二| 欧美中文字幕精品| 欧美极品欧美精品欧美视频|