2015-08-08 39 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的舊版本進行構建,以查看博客中的泄漏行爲,或者使用不同的方法創建泄漏。