【问题标题】:Android : trying to generate a memory leakAndroid:试图产生内存泄漏
【发布时间】:2015-08-08 20:11:40
【问题描述】:

我正在使用以下帖子在测试应用程序中生成内存泄漏

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

我正在使用 android studio 内存分析器和分配跟踪器来跟踪对象分配。我可以看到多次旋转屏幕时创建的活动实例。但是,当我在 android studio 上单击“启动 GC”时,所有这些实例都会被垃圾收集,尽管它们持有对可绘制对象的静态引用。我期待这些活动对象被保留,并会导致“内存不足”异常。以下是我使用的代码:

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

    }

【问题讨论】:

    标签: android android-studio memory-leaks garbage-collection


    【解决方案1】:

    问题是,你引用的那篇博文已经很老了,而且 Android SDK 自从写出来之后已经发生了很大的变化。正如教程所说,在早期:

    当Drawable 附加到视图时,视图在drawable 上设置为callback。

    但是,对于较新版本的 Android SDK,情况并非如此。

    Drawable.setCallback 早期版本的代码是(参见link):

    public final void setCallback(Callback cb) {
        mCallback = cb;
    }
    

    但它现在使用WeakReference(参见link),因此不会再泄漏:

    public final void setCallback(Callback cb) {
         mCallback = new WeakReference<Callback>(cb);
    }
    

    您可以针对旧版本的 Android 构建以查看博客中的泄漏行为,或使用不同的方法来创建泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 2019-09-17
      • 1970-01-01
      • 2013-06-05
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多