Android : 试图产生内存泄漏
Android : trying to generate a memory leak
我正在使用以下 post 在测试应用程序中产生内存泄漏
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
我正在使用 android studio 内存分析器和分配跟踪器来跟踪对象分配。我能够看到多次旋转屏幕时创建的 activity 个实例。但是,当我在 android studio 上单击 "Initiate GC" 时,所有这些实例都会被垃圾回收,尽管它们持有对可绘制对象的静态引用。我原以为这些 activity 对象会被保留并会导致 "Out of memory" 异常。以下是我使用的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("Hello View");
if(sBackground == null) {
sBackground = ContextCompat.getDrawable(this,R.drawable.back1mb);
}
mTextView = (TextView) findViewById(R.id.txtView);
textView.setBackgroundDrawable(sBackground);
setContentView(textView);
}
问题是,你引用的博客post已经很老了,而且AndroidSDK自编写以来变化很大。在早期,正如教程所说:
When a Drawable is attached to a view, the view is set as a callback on the drawable.
但是,对于较新版本的 Android SDK,情况并非如此。
Drawable.setCallback
早期版本的代码是(见link):
public final void setCallback(Callback cb) {
mCallback = cb;
}
但它现在使用 WeakReference
(see link), 所以不会再泄漏:
public final void setCallback(Callback cb) {
mCallback = new WeakReference<Callback>(cb);
}
您可以针对旧版本 Android 构建以查看博客中的泄漏行为,或者使用不同的方法来创建泄漏。
我正在使用以下 post 在测试应用程序中产生内存泄漏
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
我正在使用 android studio 内存分析器和分配跟踪器来跟踪对象分配。我能够看到多次旋转屏幕时创建的 activity 个实例。但是,当我在 android studio 上单击 "Initiate GC" 时,所有这些实例都会被垃圾回收,尽管它们持有对可绘制对象的静态引用。我原以为这些 activity 对象会被保留并会导致 "Out of memory" 异常。以下是我使用的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("Hello View");
if(sBackground == null) {
sBackground = ContextCompat.getDrawable(this,R.drawable.back1mb);
}
mTextView = (TextView) findViewById(R.id.txtView);
textView.setBackgroundDrawable(sBackground);
setContentView(textView);
}
问题是,你引用的博客post已经很老了,而且AndroidSDK自编写以来变化很大。在早期,正如教程所说:
When a Drawable is attached to a view, the view is set as a callback on the drawable.
但是,对于较新版本的 Android SDK,情况并非如此。
Drawable.setCallback
早期版本的代码是(见link):
public final void setCallback(Callback cb) {
mCallback = cb;
}
但它现在使用 WeakReference
(see link), 所以不会再泄漏:
public final void setCallback(Callback cb) {
mCallback = new WeakReference<Callback>(cb);
}
您可以针对旧版本 Android 构建以查看博客中的泄漏行为,或者使用不同的方法来创建泄漏。