8

我正在爲一些硬件移植android棉花糖。我面臨的問題是,如果我通過xml創建一個UI對象,它不會被GC掃描。 例如:通過XML創建的UI對象在Android中沒有被打掃Marshmallow

我創建了一個應用程序來檢查它。 這個程序有2個活動。 每個活動都有一個按鈕。 如果我按下此按鈕,它將結束當前活動並開始其他活動。

如果我在xml佈局和活動setcontentview中定義一個按鈕,它將創建一個類型爲button的對象。現在我一次又一次切換這些活動來創建多個按鈕對象,因爲我沒有使用任何LAUNCH_MODE(有意)。

現在讓我們說已經創建了8個Button的對象。我多次按下按鈕,進入主屏幕。我從Android Studio發起了GC。之後,如果我採取堆轉儲,我仍然發現8個按鈕的實例,但「對象的id被改變」。此外,我看到Button類的構造函數在啓動GC後未被調用。

那麼是誰創造了這些對象。如果這些是相同的對象,爲什麼ids已被更改。

同樣的事情,如果我通過使用按鈕java類創建按鈕對象做,

像鍵b =新按鈕(上下文C);

對象正在被打掃。

如果你明白問題,請說明一下。

BR, 拉胡爾

+2

你能分享一個[mcve]嗎? – antonio

回答

0

您還沒有提供給你所談論的任何代碼示例。我只能猜測,你實際上是在創造這些按鈕的對象,正如你所說,

Button b = new Button(this); 

如果在XML引用一個按鈕控件,那麼你不應該產生任何按鈕的對象,你應該只被實例化對象。在XML

<Button 
    android:id="@+id/btn_action" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

實例化按鈕的代碼

Button btnAction = (Button) findViewById(R.id.btn_action); 

此按鈕對象創建

按鈕不應該有多個ID引用。當您使用XML爲該小部件指定一個id時,參考ID會立即添加到您的R.java文件中。檢查你的R.java文件,你會看到類似的東西

public static final int btn_action=0x7f0d033b; 

這是一個最終值,它不能被改變。所以每次引用對象btnAction時,都引用了0x7f0d033b。銷燬你的活動會破壞這個對象,除非你像創建靜態對象那樣做一些奇怪的事情。

另請注意,在活動被銷燬後GC不會立即被調用。它在必要時主要被調用。如果你想幫助「強制」GC在一個Activity被銷燬時被調用,那麼請在Activity的onDestroy()中進行清理。乾杯!

@Override 
protected void onDestroy() { 
    // invoke garbage collector 
    System.gc(); 
} 

另外請記住,調用System.gc()並不一定意味着垃圾收集器將被調用。對此的定義是

向虛擬機表示現在是運行垃圾收集器的好時機。請注意,這只是一個提示。不能保證 垃圾收集器將實際運行。

+0

其實我正在努力。 With: Button b = new Button(this); 一旦我啓動GC,就會掃描按鈕的對象。 With: XML方式 當我啓動GC時,按鈕對象不會被掃描。 我明白GC不能保證,但我從Android監視器啓動它,它應該掃描所有取消引用的對象。 – Rahul

0

不需要新建一個Button,該按鈕已經在清單中定義,只需使用findViewById來查找它。