android 内存 举例

来源:互联网 发布:stc单片机iap应用 编辑:程序博客网 时间:2024/06/07 09:34

一,有关static的内存问题。

首先先看一个例子

public class MainActivity extends Activity{private static boolean test = false;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d("owen","test = "+test);test = true;}@Overridepublic void onBackPressed(){super.onBackPressed();finish();}}

上面的例子,在第一次运行时,静态变量test的值由false变成了true,当按back键退出程序后,再进入,test的值还是true,说明test并没有被GC回收。

当Activity退出时,Activity的静态变量是存在的,因为静态变量是属全局变量,静态变量是整个应用程序的公共变量(即使你这个地方写的是私有),所以Activity消毁时,静态变量是不会清除的。但当什么时候才会清除呢,上面说过静态变量是整个应用程序的,所以只有当各个应用程序的进程消毁时,静态变量才会毁,所以以下写法可以退出。

@Overridepublic void onBackPressed(){super.onBackPressed();android.os.Process.killProcess(android.os.Process.myPid());}


那么此时就引导出一个有关内存方面的问题,如果有一个静态变量,持有了一个耗资源的对象,那么就算是activity退出,这个耗资源对象也不会被回收,这就造成了严重的内存泄露。这个耗资源可以是context对象,这种问题隐藏的很深,不容易被发现。

public class MainActivity extends Activity{private static Drawable mDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);TextView textView = new TextView(this);if(mDrawable == null){Resources resources = this.getResources();  mDrawable = resources.getDrawable(R.drawable.ic_launcher);}textView.setBackgroundDrawable(mDrawable);setContentView(textView);}}

上面就有内存泄露的情况。

0 0
原创粉丝点击