2015-08-08 32 views
0

我用下面的帖子,以产生在测试应用程序中的内存泄漏安卓:试图生成一个内存泄漏

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

我使用过Android Studio内存分析器和分配跟踪器,跟踪对象分配。我可以看到多次旋转屏幕时创建的活动实例。但是当我点击android工作室上的“Initiate 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); 

    } 

回答

1

的问题是,你所引用的博客文章已经很老了,和Android SDK已经改变了很多,因为它被写。在早期的日子里,作为教程说:

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