通过XML创build的UI对象在Android Marshmallow中不会被扫描

我正在为一些硬件移植android棉花糖。 我面临的问题是,如果我通过xml创build一个UI对象,它不会被GC扫描。 例如:

我已经创build了一个应用程序来检查这个。 这个程序有2个活动。 每个活动都有一个button。 如果我按下这个button,它完成当前的活动,并开始其他活动。

如果我在xml布局和活动setcontentview中定义一个button,它将创build一个types为button的对象。 现在我一次又一次地切换这些活动来创buildbutton的多个对象,因为我没有使用任何LAUNCH_MODE(故意)。

现在让我们说button的8个对象已经被创build。 我多次按下button,回到主屏幕。 我从Android Studio启动了GC。 之后,如果我采取堆转储,我仍然find8个button的实例,但“对象的id被改变”。 而且,我看到Button类的构造函数在启动GC后没有被调用。

那么是谁创造了这些对象。 如果这些是相同的对象,为什么ids已经改变了。

同样的事情,如果我通过使用Button类创buildButton对象,

像Button b = new Button(Context c);

对象正在被扫荡。

如果你明白这个问题,请说明一下。

BR,拉胡尔

Solutions Collecting From Web of "通过XML创build的UI对象在Android Marshmallow中不会被扫描"

你还没有提供任何你正在谈论的代码示例。 我只能猜测,你实际上正在创build这些Button对象,

Button b = new Button(this); 

如果你在XML中引用一个button控件,那么你不应该创build任何Button对象,你只应该实例化对象。

用XML创build的button

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

在代码中实例化button

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

这个button对象不应该有多个id引用。 当您为XML分配一个id到这个小部件时,引用ID会立即添加到您的R.java文件中。 检查你的R.java文件,你会看到类似的东西

 public static final int btn_action=0x7f0d033b; 

这是最终的价值,不能改变。 所以每次引用对象btnAction时,都引用了0x7f0d033b。 销毁你的活动会破坏这个对象,除非你像创build静态对象那样做一些奇怪的事情。

另外请注意,在活动被破坏之后,GC不能保证立即被调用。 主要是在必要时调用。 如果你想帮助“强制”GC在一个Activity被销毁的时候被调用,那么在Activity的onDestroy()中进行清理。 干杯!

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

另外请记住,调用System.gc()并不一定意味着垃圾收集器将被调用。 这个定义是

向虚拟机表明现在是运行垃圾收集器的好时机。 请注意,这只是一个提示。 不能保证垃圾回收器实际上会运行。

不需要新build一个button,该button已经在清单中定义,只需使用findViewById来查找它。