Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android context(Application/Activity)與內存洩露

Android context(Application/Activity)與內存洩露

編輯:Android開發教程

android中的context可以做很多操作,但是最主要的功能是加載和訪問資源。

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

比如一個 activity的onCreate:

public void onCreate(Bundle savedInstanceState) {     
    super.onCreate(savedInstanceState);     

    requestWindowFeature(Window.FEATURE_NO_TITLE);     
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,      
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);     
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     


    mGameView = new GameView(this);        
    setContentView(mGameView);     
}

把activity context傳遞給view,意味著view擁有一個指向activity的引用,進而引用activity UI占有的資源: view , resource, SensorManager等。

但是這樣如果context發生內存洩露的話,就會洩露很多內存,這裡洩露的意思是gc沒 有辦法回收activity的內存(當前Activity為活動或finish後還沒來得及回收)。

 

Leaking an entire 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);      
    }
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved