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 构建以查看博客中的泄漏行为,或者使用不同的方法来创建泄漏。