Android context(Application/Activity)与内存泄露

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);
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 内存泄露
, leaks
, activity
, oncreat
, context
, 内存泄露内存android
, 一个
, OnCreate
, View回收
, android图片旋转
, android加载activity
Activity回收
activity context、context获取activity、context转activity、context activity区别、context强转activity,以便于您获取更多的相关知识。

时间: 2024-11-10 01:00:50

Android context(Application/Activity)与内存泄露的相关文章

Android 中Handler引起的内存泄露_Android

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } } } 但是,其实上面的代码可能导致内存泄露,当你使用Androi

简析Android的垃圾回收与内存泄露

Android系统是运行在Java虚拟机上的,作为嵌入式设备,内存往往非常有限,了解Android的垃圾回收机制,可以有效的防止内存泄露问题或者OOM问题.本文作为入门文章,将浅显的讨论垃圾回收与内存泄露的原理,不讨论Dalvik虚拟机底层机制或者native层面的问题. 1. 基础 在分析垃圾回收前,我们要复习Java与离散数学的基础. 实例化:对象是类的一个实例,创建对象的过程也叫类的实例化.对象是以类为模板来创建的.比如Car car = new Car();,我们就创造了一个Car的实例

Android垃圾回收机制解决内存泄露问题_Android

在android编码中,会有一些简便的写法和编码习惯,会导致我们的代码有很多内存泄露的问题,在这里做一个已知错误的总结:1.编写单例的时候常出现的错误. 错误方式: public class Foo{ private static Foo foo; private Context mContext; private Foo(Context mContext){ this.mContext = mContext; } // 普通单例,非线程安全 public static Foo getInsta

Android垃圾回收机制解决内存泄露问题

在android编码中,会有一些简便的写法和编码习惯,会导致我们的代码有很多内存泄露的问题,在这里做一个已知错误的总结: 1.编写单例的时候常出现的错误. 错误方式: public class Foo{ private static Foo foo; private Context mContext; private Foo(Context mContext){ this.mContext = mContext; } // 普通单例,非线程安全 public static Foo getInst

Android 中Handler引起的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } } } 但是,其实上面的代码可能导致内存泄露,当你使用Androi

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

Android中Handler引起的内存泄露问题解决办法_java

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 复制代码 代码如下: public class SampleActivity extends Activity {   private final Handler mLeakyHandler = new Handler() {     @Override     public void handleMessage(Message msg) {       // ...     }  

Android中Handler可能引起内存泄露

先来看一段代码: 1. private Handler mHandler = new Handler() { 2. @Override 3. public void handleMessage(Message msg) { 4. // ... 5. } 6. }; 这样的写法eclipse会给出一个leak的提示This Handler class should be static or leaks might occur...,表示有可能出现内存泄漏,分析如下: 1) 当一个Handler对象

避免 Android中Context引起的内存泄露_Android

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄

避免 Android中Context引起的内存泄露

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄