Objeto de interfaz de usuario creado a través de XML no se está barajando en Android Marshmallow

Estoy trabajando en portar android marshmallow para algunos hardware. El problema que enfrento es, si creo un objeto de interfaz de usuario a través de xml, no está siendo sweeped por GC. Por ejemplo:

He creado una aplicación para comprobar esto. Esta aplicación tiene 2 actividades. Cada actividad tiene un botón. Si presiono este botón, termina la actividad actual e inicia otra actividad.

Si defino un botón en la disposición del xml y en la actividad setcontentview, creará un objeto del botón del tipo. Ahora estoy conmutando estas actividades una y otra vez para crear objetos múltiples del botón, puesto que no estoy utilizando cualquier LAUNCH_MODE (intencionalmente).

Ahora vamos a decir que 8 objetos de Button han sido creados. Volví a pulsar el botón varias veces y llegó a la pantalla de inicio. Inicie GC desde Android Studio. Después de que si tomo Heap Dump, todavía encuentro 8 instancias de Button pero "ids de objetos se cambian". Por otra parte, vi que el constructor de la clase Button no se llamaba después de iniciar GC.

Entonces, ¿quién creó estos objetos? Y si estos son los mismos objetos, por qué se ha cambiado ids.

Lo mismo si lo hago creando un objeto Button usando la clase Button java,

Como Botón b = nuevo Botón (Contexto c);

Los objetos están siendo barridos.

Ponga por favor un poco de luz si usted entiende el problema.

BR, Rahul

No ha proporcionado ningún ejemplo de código para lo que está hablando. Sólo puedo adivinar que en realidad está creando estos objetos Button como mencionó,

Button b = new Button(this); 

Si estás haciendo referencia a un widget de botón en XML, entonces no deberías estar creando ningún objeto Button, solo deberías instanciar el objeto.

Botón creado en XML

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

Instanciar el botón en el código

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

Este objeto de botón no debe tener varias referencias de id. Cuando asigna un identificador a este widget en XML, el ID de referencia se agrega inmediatamente a su archivo R.java. Compruebe su archivo de R.java usted verá algo como

 public static final int btn_action=0x7f0d033b; 

Este es un valor final, no se puede cambiar. Así que cada vez que hace referencia al objeto, btnAction, está haciendo referencia a 0x7f0d033b. La destrucción de tu actividad destruirá este objeto a menos que estés haciendo algo extraño como crear objetos estáticos.

También tenga en cuenta que no hay garantía de que GC se llamará inmediatamente después de una actividad se destruye. Se llama sobre todo cuando es necesario. Si desea ayudar a "obligar" GC a ser llamado cuando una actividad es destruida, entonces limpiar en onDestroy () de la actividad. ¡Aclamaciones!

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

También tenga en cuenta que llamar a System.gc () no significa necesariamente que se llamará Garbage Collector. La definición para esto es

Indica a la VM que sería un buen momento para ejecutar el recolector de basura. Tenga en cuenta que esto es sólo una pista. No hay ninguna garantía de que el recolector de basura se ejecutará realmente.

No hay necesidad de un nuevo botón, el botón ya está definido en el manifiesto, sólo con findViewById para buscarlo.

  • Biblioteca para generar la firma HMAC-SHA1 OAuth en Android?
  • La solicitud HTTPS se bloquea sólo en las API de Android inferiores a 20 incluso con un tiempo de espera de conexión establecido
  • Manejo de errores de actualización
  • Cómo manejar arrastrar en una aplicación de ajedrez Android?
  • ¿Hay alguna forma más rápida de iterar a través de las filas de la consulta Sqlite?
  • ¿Cómo hacer esto más eficiente?
  • ¿Derivados en Java?
  • Java / Eclipse - No más archivo R nunca
  • Android Library Package perdió el nombre de los parámetros de las interfaces internas
  • LibGdx Gdx-Pay extensión obtener el precio del artículo
  • Manipulación de bytecode de Android y java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.